Je suppose que vous ne pouvez pas lier un Java génériques type de paramètre à une limite inférieure (c'est à dire à l'aide de l' super
mot-clé). J'ai été lire ce que le Angelika Langer Génériques FAQ avaient à dire sur le sujet. Ils disent que cela vient essentiellement vers le bas pour une limite inférieure d'être inutile ("parler").
Je ne suis pas convaincu. Je peux imaginer une utilisation pour eux pour vous aider à être plus souples pour les appelants d'une bibliothèque méthode qui produit typé résultat. Imaginez une méthode qui a créé un tableau de la liste de l'utilisateur spécifié la taille et le remplit avec la chaîne vide. Une simple déclaration serait
public static ArrayList<String> createArrayListFullOfEmptyStrings(int i);
Mais c'est inutilement restrictive pour vos clients. Pourquoi ne peuvent-ils invoquer votre méthode comme ceci:
//should compile
List<Object> l1 = createArrayListFullOfEmptyStrings(5);
List<CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
List<String> l3 = createArrayListFullOfEmptyStrings(5);
//shouldn't compile
List<Integer> l4 = createArrayListFullOfEmptyStrings(5);
À ce point, je serais tenté d'essayer la définition suivante:
public static <T super String> List<T> createArrayListFullOfEmptyStrings(int size) {
List<T> list = new ArrayList<T>(size);
for(int i = 0; i < size; i++) {
list.add("");
}
return list;
}
Mais il ne compile pas; l' super
mot-clé est illégal dans ce contexte.
Est mon exemple ci-dessus est un mauvais exemple (en ignorant ce que je dis ci-dessous)? Pourquoi n'est-il pas une limite inférieure utile ici? Et si il serait utile, ce qui est la vraie raison pour laquelle il n'est pas permis en Java?
P. S.
Je sais qu'une meilleure organisation pourrait être quelque chose comme ceci:
public static void populateListWithEmptyStrings(List<? super String> list, int size);
List<CharSequence> list = new ArrayList<CharSequence>();
populateListWithEmptyStrings(list, 5);
Pouvons-nous pour le but de cette question de prétendre qu'en raison d'une exigence, nous avons besoin de faire les deux opérations en un seul appel de méthode?
Modifier
@Tom G (à juste titre) demande quels sont les avantages d'avoir un List<CharSequence>
sur un List<String>
. Pour l'un, personne n'a dit que la liste retournée est immuable, voici donc un avantage:
List<CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
l2.add(new StringBuilder("foo").append("bar"));