0

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);
Chris Morris
  • 4,335
  • 4
  • 24
  • 28

0 Answers0