从我的上一个问题here开始:
我有一个类似的课程:
public class nVector<T extends nVector<?>> {
int i;
public T add(T a) {
}
}
并希望发生以下情况:
public T add(T a) {
T b = this.clone();
b.i += a.i;
return b;
}
但是不允许通用类型T
的实例化。然而,我可以轻松地在我的论证中包含一个T实例。
我这样做是因为我有多个T
类型的子项继承了nVector
中的所有方法,并在“封闭环境”中自行处理。 (即他们只把自己的类型作为论据,而不是其他孩子)
有什么方法可以解决这个问题?问题是,我 要返回T
类型的内容,而不是nVector<?>
。
答案 0 :(得分:2)
您可以将Class<T>
传递给nVector
构造函数。然后使用cls.newInstance()
。像,
public class nVector<T extends nVector<?>> {
Class<T> cls;
int i; // <-- default value 0. Should probably be set in the constructor
// or with a setter method.
public nVector(Class<T> cls) {
this.cls = cls;
}
public T add(T a) {
T b = null;
try {
b = cls.newInstance();
b.i = this.i + a.i; // <-- equivalent, thx @LukeLee
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return b;
}
}
当然,如果您只需要T
返回 - 您可以return a;