通用方法<?>类型参数

时间:2020-10-04 14:24:22

标签: java generics

在图表库中,我找到了以下类别:

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 个答案:

答案 0 :(得分:0)

由于<?>类型,我无法找到如何使用该类。我找不到能满满签名的参数。如何使用?

您几乎无法使用它。除了通过SeriesBuilder之外,无法获取SeriesBuilder.get()实例,并且通过这种方式获取的实例的类型参数是未知的-实际上,get实际实例化的是原始类型。如果愿意,您应该能够产生一系列null

甚至没有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();