Универсальный метод Аргументы Типа

#java #generics

#java #общие

Вопрос:

В библиотеке для диаграмм я нашел следующий класс:

 public class SeriesBuilder<T> {
    private T[] data;

    private SeriesBuilder() {
    }

    public static SeriesBuilder<?> get() {
        return new SeriesBuilder();
    }
    
    public SeriesBuilder<T> withData(T... data) {
        this.data = data;
        return this;
    }

    public Series<T> build() {
        Series<T> series = new Series<T>();
        series.setData(data);
        return series;
    }
}
  

Использование кода:

 SeriesBuilder.get()
             .withData(<<<<<???>>>>)
             .build()
  

Я не в состоянии выяснить, как использовать класс из-за <?> Тип. Я не могу найти аргумент, который полностью заполняет подпись. Как это использовать?

Комментарии:

1. null это единственный аргумент, который будет работать. Тот, кто написал этот SeriesBuilder, не знает, как использовать generics . Подпись должна быть public static <U> SeriesBuilder<U> get() { return new SeriesBuilder<>(); }

2. @Eklavya обратите внимание, что конструктор является закрытым. Я вынужден использовать get() .

Ответ №1:

Я не в состоянии выяснить, как использовать класс из-за <?> Тип. Я не могу найти аргумент, который полностью заполняет подпись. Как это использовать?

Вы в значительной степени не можете его использовать. Нет способа получить SeriesBuilder экземпляр, кроме как через SeriesBuilder.get() , и параметр типа экземпляра, который вы получаете таким образом, неизвестен — фактически, то, что get на самом деле создает экземпляр, — это необработанный тип. Вы должны быть в состоянии создать серию null s, если хотите.

Не может быть даже подклассов SeriesBuilder (которые могли бы быть более удобными), потому что его единственный конструктор является закрытым.

Не придавая этому слишком большого значения, это SeriesBuilder в значительной степени мерзость. Существует аргумент в пользу предпочтения заводских методов (таких как SeriesBuilder.get() ) над конструкторами, но эта реализация ужасна. В дополнение к проблемам с параметрами типа, он не инициализирует результирующий объект в допустимое состояние. Это должно быть сделано отдельно через withData() , так в чем же смысл get() предполагаемого?

Я склонен думать, что тот, кто это написал, искал что-то, что было бы лучше выражено с помощью этого варианта withData() :

     public static <T> SeriesBuilder<T> withData(T ... data) {
        SeriesBuilder<T> builder = new SeriesBuilder<>();

        builder.data = data;
        return builder;
    }
  

Вы можете использовать это как

 SomeType item1 = /* value */;
SomeType item2 = /* value */;
SomeType item3 = /* value */;

Series<SomeType> series =
        SeriesBuilder.withData(item1, item2, item3)
                     .build();