J'ai été surpris, mais ... ça se compile :
public <T extends Database> ColMetaData<T>[] getTableColumnsAsEnums() {
Class<? extends ColMetaData> cls = this.columnsEnumToken();
return cls.<ColMetaData<T>[]>getEnumConstants(); }
Voici la méthode pour columnsEnumToken :
// Returns a class token for an enum class
public Class<? extends ColMetaData> columnsEnumToken() {
return this.e_colsToken;
}
(Je suppose que je peux voir pourquoi la deuxième ligne ci-dessous ne compile pas)
Quelques questions :
-
Cette méthode est-elle "sûre" ?
-
Pourquoi cette ligne compile-t-elle :
Class<? extends ColMetaData> cls = this.columnsEnumToken();
Mais celui-ci ne compile pas à cause de types incompatibles :
Class<? extends ColMetaData<T>> cls = this.columnsEnumToken();
-
Pourquoi est-il légal pour la méthode
getTableColumnsAsEnums()
pour retourner un tableau d'un type concret paramétré,ColMetaData<T>[]
. J'avais pensé qu'ils étaient strictement interdits parce qu'il n'y avait aucun moyen de les faire fonctionner de manière sûre au moment de l'exécution.