我有一个带有属性SubMessage的AutoValue,也是一个AutoValue。顶层AutoValue有一个Builder,允许您使用set(SubMessage)设置AutoValueSubMessage属性。然而,当我声明set(SubMessage.Builder)时,会出现编译错误。但是,由于get()返回SubMessage而不是SubMessage.Builder,因此存在编译错误。我做得不对吗?有什么建议吗?
值得注意的是,我试图避免定义这样的非抽象方法:
public MainMessage.Builder setSubMessage(SubMessage.Builder builder) {
setSubMessage(builder.build());
return this;
}
AutoValue的目标之一是删除尽可能多的样板,这就是为什么我试图弄清楚AutoValue是否会自动生成我需要的代码。
示例如下:
@AutoValue
public abstract static class MainMessage {
public static Builder builder() {
return new AutoValue_MainClass_MainMessage.Builder();
}
public abstract SubMessage subMessage();
public abstract Builder toBuilder();
/** Builder for MainMessage. */
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setSubMessage(SubMessage value);
public abstract Builder setSubMessage(SubMessage.Builder value);
public abstract SubMessage.Builder subMessageBuilder();
public abstract MainMessage build();
}
}
@AutoValue
public abstract static class SubMessage {
public static Builder builder() {
return new AutoValue_MainClass_SubMessage.Builder();
}
public abstract int someValue();
public abstract Builder toBuilder();
/** Builder for SubMessage. */
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setSomeValue(int value);
public abstract SubMessage build();
}
}
错误:
[AutoValueGetVsSet] Parameter type MainClass.SubMessage.Builder of setter method should be com.google.sandbox.MainClass.SubMessage to match property method com.google.sandbox.MainClass.MainMessage.subMessage()
public abstract Builder setSubMessage(SubMessage.Builder value);