英文:
java: incompatible types: java.lang.Long cannot be converted to ValidFor
问题
I have two classes
- Builder for SpecContext object
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Builder;
import lombok.Data;
import lombok.Value;
import javax.annotation.Nullable;
import java.time.LocalDateTime;
@Data
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class SpecContext {
private Long globalPriceId;
private Long priceId;
private ValidFor validFor;
@JsonCreator
public SpecContext(
@JsonProperty(value = "globalPriceId")
Long globalPriceId,
@JsonProperty(value = "validFor")
ValidFor validFor,
@JsonProperty(value = "priceId")
Long priceId
) {
this.globalPriceId = globalPriceId;
this.validFor = validFor;
this.priceId = priceId;
}
}
- Builder for ValidFor object
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import utils.DateJsonDeserializer;
import utils.DateJsonSerializer;
import lombok.*;
import java.time.LocalDateTime;
@Data
@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class ValidFor {
private LocalDateTime startDateTime;
private LocalDateTime endDateTime;
public static final String START_DATE_TIME = "startDateTime";
public static final String END_DATE_TIME = "endDateTime";
@JsonCreator
public ValidFor(
@JsonDeserialize(using = DateJsonDeserializer.class)
@JsonSerialize(using = DateJsonSerializer.class)
@JsonProperty(value = START_DATE_TIME)
LocalDateTime startDateTime,
@JsonDeserialize(using = DateJsonDeserializer.class)
@JsonSerialize(using = DateJsonSerializer.class)
@JsonProperty(value = END_DATE_TIME)
LocalDateTime endDateTime
) {
this.startDateTime = startDateTime;
this.endDateTime = endDateTime;
}
public static ValidForBuilder builder() {
return new ValidForBuilder();
}
public static class ValidForBuilder {
private LocalDateTime startDateTime;
private LocalDateTime endDateTime;
public ValidForBuilder() {
}
public ValidForBuilder startDateTime(LocalDateTime startDateTime) {
this.startDateTime = startDateTime;
return this;
}
public ValidForBuilder endDateTime(LocalDateTime endDateTime) {
this.endDateTime = endDateTime;
return this;
}
public ValidFor build() {
return new ValidFor(startDateTime, endDateTime);
}
}
}
I use it in an autotest:
void test() {
SpecContext sp = SpecContext.builder()
.globalPriceId(101928081L)
.priceId(2L)
.validFor(ValidFor.builder()
.startDateTime(LocalDateTime.of(2019, 10, 10, 14, 15, 00))
.endDateTime(LocalDateTime.of(2025, 10, 10, 14, 15, 00))
.build())
.build();
During compilation, I got the error
java: incompatible types: java.lang.Long cannot be converted to ValidFor
I don't understand why globalPriceId and priceId are being tried to convert to ValidFor?
I tried to use Lombok @Builder for ValidFor but got the same error.
How can I fix this problem?
Thank you.
英文:
I have two classes
- Builder for SpecContext object
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Builder;
import lombok.Data;
import lombok.Value;
import javax.annotation.Nullable;
@Data
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class SpecContext {
private Long globalPriceId;
private Long priceId;
private ValidFor validFor;
@JsonCreator
public SpecContext(
@JsonProperty(value = "globalPriceId")
Long globalPriceId,
@JsonProperty(value = "validFor")
ValidFor validFor,
@JsonProperty(value = "priceId")
Long priceId
) {
this.globalPriceId = globalPriceId;
this.validFor = validFor;
this.priceId = priceId;
}
}
- Builder for ValidFor object
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import utils.DateJsonDeserializer;
import utils.DateJsonSerializer;
import lombok.*;
import java.time.LocalDateTime;
@Data
@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class ValidFor {
private LocalDateTime startDateTime;
private LocalDateTime endDateTime;
public static final String START_DATE_TIME = "startDateTime";
public static final String END_DATE_TIME = "endDateTime";
@JsonCreator
public ValidFor(
@JsonDeserialize(using = DateJsonDeserializer.class)
@JsonSerialize(using = DateJsonSerializer.class)
@JsonProperty(value = START_DATE_TIME)
LocalDateTime startDateTime,
@JsonDeserialize(using = DateJsonDeserializer.class)
@JsonSerialize(using = DateJsonSerializer.class)
@JsonProperty(value = END_DATE_TIME)
LocalDateTime endDateTime)
{
this.startDateTime = startDateTime;
this.endDateTime = endDateTime;
}
public static ValidForBuilder builder() {
return new ValidForBuilder();
}
public static class ValidForBuilder {
private LocalDateTime startDateTime;
private LocalDateTime endDateTime;
public ValidForBuilder() {
}
public ValidForBuilder startDateTime(LocalDateTime startDateTime) {
this.startDateTime = startDateTime;
return this;
}
public ValidForBuilder endDateTime(LocalDateTime endDateTime) {
this.endDateTime = endDateTime;
return this;
}
public ValidFor build() {
return new ValidFor(startDateTime, endDateTime);
}
}
}
I use it in an autotest:
void test() {
SpecContext sp = SpecContext.builder()
.globalPriceId(101928081L)
.priceId(2L)
.validFor(ValidFor.builder().
startDateTime(LocalDateTime.of(2019, 10, 10, 14, 15, 00))
.endDateTime(LocalDateTime.of(2025, 10, 10, 14, 15, 00))
.build())
.build();
During complilation I got the error
java: incompatible types: java.lang.Long cannot be converted to ValidFor
I don't understand why globalPriceId and priceId are being tried to convert in ValidFor?
I tried to use Lombok @Builder for ValidFor but got the same error
How can I fix this problem?
Thank you
答案1
得分: 2
Lombok的@Builder
要求你拥有一个构造函数,其中包含每个字段,按照字段列出的顺序。这就是为什么@Builder
会为你生成这个,但如果你想编写自己的构造函数,你也可以这样做。在这里,你这样做了,但你的构造函数参数列表 不匹配 - 你交换了顺序:在你的构造函数中,顺序是:[Long globalPriceId, ValidFor validFor, Long priceId]
,但在你的字段中,顺序是[Long globalPriceId, Long priceId, ValidFor validFor]
。
英文:
Lombok @Builder
requires that you have a constructor that contains each and every field, in the same order your fields are listed. This is why @Builder
will generate this for you, but if you want to write your own constructor, you can do that too. You did here, and your constructor's argslist does not match up - you have swapped orders: In your constructor, the order is: [Long globalPriceId, ValidFor validFor, Long priceId]
, but in your fields the order is [Long globalPriceId, Long priceId, ValidFor validFor]
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论