【发布时间】:2018-08-04 09:55:15
【问题描述】:
我在使用 Java 中的泛型时遇到了一些问题。我有一个通用基类A,它定义了一个静态工厂方法来创建具有初始值的A 实例。我这样做是为了在创建 A 的实例时设置一些初始值,而不是指定设置初始值的构造函数,因为它会涉及在构造函数中调用可覆盖的方法(强烈建议不要这样做)。
public class A<T> {
private List<T> values;
public A() {
this.values = new ArrayList<>();
}
public void setValues(List<T> values) {
this.values.clear();
for (T value : values) {
this.values.add(this.modify(value));
}
}
protected T modify(T value) {
// Make modifications to value before it is stored. My real implementation actually does stuff.
return value;
}
public static <T> A<T> create(List<T> values) {
A<T> a = new A<>();
a.setValues(values);
return a;
}
}
我还有一个类B,它扩展A 并指定要使用的泛型类型。
public class B extends A<Integer> {
public B() {
super();
}
}
我希望能够使用B 中的create 静态方法来创建带有初始项的B 实例。尝试调用 B.create(...) 时,我收到一条错误消息:
错误:(5, 23) java: 不兼容的类型: 不存在类型变量 T,E 的实例,因此 A 符合 B
所以我决定尝试为create 定义一个特定于B 类的实现:
public static B create(List<String> values) {
B b = new B();
b.setValues(values);
return b;
}
但这次我得到一个不同的错误:
Error:(8, 21) java: name conflict: create(java.util.List) in B 和 create(java.util.List) in A 具有相同的擦除,但都没有隐藏另一个
虽然我理解每个错误的实际含义,但我不知道如何绕过它们。如何在A 上定义一个可与任何子类一起使用的静态工厂方法,或者如何在A 上定义一个静态工厂方法,以及在覆盖/隐藏的A 的每个适用子类上定义一个静态工厂方法A的实现?
【问题讨论】: