我有一个抽象类和2个(现在)的女儿班。
主类:
public abstract class Entite<T> {
public Entite(int ligne, int colonne, Etat etat) {
...
}
/* Some method here*/
}
女儿1(女儿2几乎相等):
public class Cellule extends Entite<Cellule> {
public Cellule(int ligne, int colonne, Etat etat) {
super(ligne, colonne, etat);
}
/** Override some method here */
}
现在我想在其他类中使用泛型。
public class Grille<T extends Entite<T>> {
protected final T[][] grille;
public Grille(int dimension, int nbCellulesInitiales, Class<T> classe) {
grille = (T[][])Array.newInstance(classe, 1); // It's good ?
Etat etat = Etat.Morte;
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
grille[i][j] = new T(i, j, etat); //How can I create T (Cellule) object ?
}
}
Java对我来说是新的,所以我希望我没有做过白痴错误;)
答案 0 :(得分:3)
您无法使用类型参数创建类似的实例。您不能将new
运算符与类型参数或通配符参数化类型类型相关联。但是,由于构造函数中已经有Class<T>
参数,因此可以使用它来使用Class#getConstructor
方法获取相应的构造函数。然后使用Constructor#newInstance
方法通过适当的参数实例化对象:
Constructor<T> const = classe.getConstructor(int.class, int.class, Etat.class);
for (int j = 0; j < dimension; j++) {
grille[i][j] = const.newInstance(i, j, etat);
}
答案 1 :(得分:0)
更通用的方法是传递工厂,而不是传递Class
。