Как пропустить генерацию testBuilder с AutoValue в универсальном классе

Версия автозначения: 1.3

Учитывая следующий класс:

@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();
    }
}

Когда автоматический сборщик генерирует исходники для вышеуказанного класса, он генерирует что-то вроде:

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

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

Обратите внимание, что общий метод testBuilder генерируется неправильно, потому что ему нужно <E> после static.

Вот что должно было получиться:

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

Есть ли способ не генерировать этот метод testBuilder или способ гарантировать, что AutoValue генерирует правильные источники?

Спасибо.

РЕДАКТИРОВАНИЕ: Только что обновился до версии 1.4, и все равно происходит то же самое

Проблема с GH: https://github.com/google/auto/issues/511


person smac89    schedule 03.08.2017    source источник
comment
Я бы не ожидал, что это скомпилируется. Разве это не должно быть public abstract ImmutableSet<T> someField(); с T вместо E? E в этот момент не входит в область действия.   -  person Louis Wasserman    schedule 03.08.2017
comment
@LouisWasserman, это была опечатка. Починил это   -  person smac89    schedule 03.08.2017


Ответы (1)


Решение оказалось на удивление не слишком сложным:

Просто переименуйте статический метод 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 больше не создается.

person smac89    schedule 03.08.2017
comment
Это проблема с расширением AutoValue, а не с самим AutoValue. - person emcmanus; 03.08.2017
comment
@emcmanus, спасибо за внимание. Я временно отключу плагин - person smac89; 04.08.2017