Envoyé par
bobuse
Bref, je n'en ai jamais eu l'utilité, donc je ne me rend pas compte de la gène occasionné. Donc je ne vote pas
En fait le problème ne vient pas directement des Collections mais des Generics sur les méthodes. Mais ce problème ne se pose que dans très peu de cas très spécifique.
Attention je parle bien des méthodes generics et non pas des classes generics, c'est à dire que le <T> est situé sur la méthode et non pas sur la classe. Par exemple si on prend la méthode Collections.sort() déclaré comme ceci :
public static <T extends Comparable<? super T>> void sort(List<T> list) {
En fait lorsque on l'utilise on devrait toujours spécifié le type paramétré comme ceci :
1 2 3
| List<String> list = ...
Collections.<String>sort(list); |
Heureusement le compilateur arrive à détecter le paramétrage par lui même et on n'est pas obligé de l'indiquer et continuer à écrire simplement :
Comme list est de type List<String>, le compilateur arrive à déterminer que <T> correspond à String...
En fait on n'est obligé d'indiquer le paramétrage qu'en cas d'ambigüité du compilateur, mais en règle général c'est assez rare...
Le problème avec emptySet() (et les autres méthodes du même type), c'est que le compilateur ne peut se baser que sur le type de retour et qu'il est assez limité.
emptySet() est déclaré de la manière suivante :
public static final <T> Set<T> emptySet() {
Lorsque tu fais ceci il n'y a aucun problème :
Set<String> set = Collections.emptySet();
Le compilateur arrive à déterminer que <T> vaut String
selon le type de la variable qui va recevoir la valeur de retour.
Par contre lorsque tu utilises une méthode, cela ne marche plus :
1 2 3
| public void method(Set<String> set) {
...
} |
method( Collections.emptySet() ); // BAD
Ne marche pas car la valeur de retour n'est pas mise dans une variable, et que le compilateur ne peut donc pas la déterminer par ce moyen là.
Pourtant dans ce cas le compilateur pourrait très bien utiliser le type du paramètre de la méthode pour déterminer le paramétrage à utiliser...
Cette proposition consiste en fait à simplement faire en sorte que le compilateur utilise également le type des paramètres qui reçoivent le retour d'une méthode...
C'est vraiment un cas très particulier assez anedoctique mais je pense que cela devrait être pris en compte...
@ n!co
1. La modficiation de emptySet() ou autre renvoi une exception
2. foreach ne pose aucun problème (on n'y rentre tout simplement pas).
a++
Partager