1

我有一个抽象类和 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 对我来说是新的,所以我希望我没有犯白痴错误;)

4

2 回答 2

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); 
}
于 2013-11-01T15:44:12.503 回答
0

更一般的方法是通过工厂,而不是通过Class.

于 2013-11-01T23:35:09.560 回答