如何在通用 class 中使用 AutoValue 跳过 testBuilder 的生成

How to skip generation of testBuilder with AutoValue in generic class

自动值版本:1.3

给出以下 class:

@AutoValue
public abstract class SimpleClass<T> {
    public static <E> SimpleClass<E> create(Set<? extends E> someField) {
        return SimpleClass.<E>builder().someField(someField).build();
    }

    public static <E> Builder<E> builder() {
        return new AutoValue_SimpleClass.Builder<E>();
    }

    public abstract ImmutableSet<T> someField();

    @AutoValue.Builder
    public abstract static class Builder<T> {
        public abstract Builder<T> someField(Set<? extends T> someField);
        public abstract SimpleClass<T> build();
    }
}

当自动生成器生成上述 class 的源代码时,它会生成如下内容:

final class AutoValue_SimpleClass<T> extends $AutoValue_SimpleClass<T> {
  AutoValue_SimpleClass(ImmutableSet<T> someField) {
    super(someField);
  }

  static SimpleClass.Builder<E> testBuilder() {
      return builder();
  }
}

请注意泛型方法 testBuilder 是如何错误生成的,因为它在 static 之后需要 <E>

这是应该生成的:

static <E> SimpleClass.Builder<E> testBuilder() {
    return builder();
}

是否有办法不生成此 testBuilder 方法或确保 AutoValue 生成正确来源的方法?

谢谢。

编辑: 刚刚更新到 1.4,同样的事情还在发生

关于 GH 的问题:https://github.com/google/auto/issues/511

令人惊讶的是,解决方案并没有太复杂:

只需重命名静态 builder 方法

@AutoValue
public abstract class SimpleClass<T> {
    public static <E> SimpleClass<E> create(Set<? extends E> someField) {
        return SimpleClass.<E>getBuilder().someField(someField).build();
    }

    public static <E> Builder<E> getBuilder() {
        return new AutoValue_SimpleClass.Builder<E>();
    }

    public abstract ImmutableSet<T> someField();

    @AutoValue.Builder
    public abstract static class Builder<T> {
        public abstract Builder<T> someField(Set<? extends T> someField);
        public abstract SimpleClass<T> build();
    }
}

这意味着不再生成testBuilder方法。