I have an AutoValue
with a property, SubMessage
, that is also an AutoValue
. The top-level AutoValue
has a Builder
that allows you to set the AutoValue
SubMessage
property with set(SubMessage)
. However, I get a compilation error when I declare a set(SubMessage.Builder)
. However, there is a compilation error because the get()
returns SubMessage
and not SubMessage.Builder
. Am I doing this incorrectly? Is there a suggested work around?
Notably, I am trying to avoid defining a non-abstract method like so:
public MainMessage.Builder setSubMessage(SubMessage.Builder builder) {
setSubMessage(builder.build());
return this;
}
One of the goals of AutoValue
is to remove as much boilerplate as possible, which is why I'm trying to figure out if AutoValue
will auto-generate the code I require.
Example below:
@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();
}
}
Error:
[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);