Créer de nouvelles instances d'une classe à partir d'un tableau de classes Java


J'essaie de créer un tableau de classes en Java. Pas des objets, mais des classes. Actuellement, j'ai une classe MyBaseClass et j'en étends trois classes MyClass1, MyClass2 et MyClass3. Je stocke ces classes dans un tableau statique comme ceci:

private static MyBaseClass[] classes = {
        new MyClass1(),
        new MyClass2(),
        new MyClass3()
};

public static MyBaseClass getInstanceOfClass(int index) {
    return classes[index];
}

Et puis j'utilise ces méthodes comme ceci:

try {
    MyBaseClass obj = getInstanceOfClass(index).getClass().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}

Maintenant, je me demande si je pourrais le faire d'une manière plus facile. Si je pouvais créer un tableau de classes, je pourrais peut-être échapper à la méthode getInstanceOfClass() et à certaines exceptions possibles. J'ai essayé de faire ceci:

private static Class<MyBaseClass>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};

Mais cela me donne une erreur "Types incompatibles" car MyClass1 n'est pas égal à MyBaseClass. Fait intéressant, cela fonctionne apparemment:

private static Class<?>[] classes = {
        new MyClass1().getClass(),
        new MyClass2().getClass(),
        new MyClass3().getClass()
};

Mais l'idée de cela est horrible et elle est même marquée par mon débogueur. Alors, de meilleures façons de le faire?

Modifier:

Cela fonctionne:

private static Class<?>[] classes = {
        MyClass1.class,
        MyClass2.class,
        MyClass3.class
};

Mais alors le résultat de getInstanceOfClass(index).newInstance(); est un objet donc je dois faire du typecasting. Je ne sais pas vraiment si c'est sûr dans ce cas...

Author: Finnboy11, 2014-08-11

1 answers

Vous devez indiquer que vous recherchez éventuellement des sous-classes de MyBaseClass. Pour cela, vous pouvez ajouter ? extends à la description de type générique. Notez que cela acceptera également MyBaseClass lui-même.

Ajouté à cela, vous pouvez utiliser .class pour obtenir l'objet Class d'une classe, au lieu de faire une isntance et d'appeler getClass().

Malheureusement, cela ne fonctionne pas avec les tableaux car ils n'autorisent pas les types génériques. Vous devez donc les ajouter à une liste (ce qui est presque toujours un bon chose):

private static ArrayList<Class<? extends MyBaseClass>> classes = new ArrayList<Class<? extends MyBaseClass>>();

...

classes.add(MyClass1.class),
classes.add(MyClass2.class),
classes.add(MyClass3.class),
 3
Author: Thirler, 2014-08-11 14:36:23