Les génériques et les tableaux ne se mélangent pas, en fait. La réponse courte est que vous pouvez contourner ce problème. La plus longue réponse, c'est que vous ne devriez probablement pas et je vais vous expliquer pourquoi.
Vous pouvez utiliser Array.newInstance()
comme ceci:
private Comparable[] hashtable;
...
hashtable = (Comparable)Array.newInstance(Comparable.class, tableSize);
mais vous ne pouvez pas créer un tableau de votre type paramétré.
Les tableaux sont covariants. Cela signifie qu'ils conservent le type de leurs éléments au moment de l'exécution. Java les génériques ne sont pas. Ils utilisent le type d'effacement en gros de masque de la conversion implicite qui se passe. Il est important de comprendre que.
Ainsi, lorsque vous créez un tableau d'Objets que vous ne pouvez pas jeter à, disons, un Comparable tableau (ou autre) parce que ce n'est pas correct.
Pour vous donner un exemple. Avec les génériques c'est parfaitement légal:
List<String> list = new ArrayList<String>();
List<Integer> list2 = (List<Integer>)list;
list.add(3);
C'est aussi pourquoi vous ne pouvez pas faire ceci:
public <T> T newInstance(T t) {
return new T(); // error!
}
c'est à dire à exécution il n'y a aucune connaissance de la T de la classe. C'est pourquoi le code ci-dessus est le plus souvent écrit que:
public <T> T newInstance(T t, Class<T> clazz) {
return clazz.newInstance();
}
parce que n'est pas leur runtime type de l'argument générique. Mais avec les tableaux:
String arr[] = new String[10];
Integer arr2[] = (Integer[])arr; // error!
Ce que vous devez faire dans ce cas (à mon humble avis) n'est pas à l'aide de tableaux, mais à l'aide d'un ArrayList
. En toute honnêteté, il ya très peu de raisons d'utiliser des tableaux sur un ArrayList
et les génériques est qu'un exemple de cela.
Pour une meilleure et plus complète voir l'explication de l' (excellent) Java Génériques FAQ:
Puis-je créer un tableau dont le type de composant est un béton de type paramétré?
Non, car il n'est pas de type sécurisé.
Les tableaux sont covariants, ce qui signifie que
un tableau de supertype des références est un
supertype d'un tableau de sous-type
les références. C'est, Object[]
est un
supertype de String[]
et une chaîne
tableau peut être consulté par le biais d'un
référence variable de type Object[]
.
...