我有一个带有属性SubMessage
的AutoValue
,也是一个AutoValue
。顶层AutoValue
有一个Builder
,允许您使用set(SubMessage)
设置AutoValue
SubMessage
属性。然而,当我声明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);