Donc, j'ai une classe avec un constructeur comme ceci:
public FilterList(Set<Integer> labels) {
...
}
et je veux construire un nouveau FilterList
objet avec un ensemble vide. Suivant Joshua Bloch conseils dans son livre Efficace Java, je ne veux pas créer un nouvel objet pour l'ensemble vide; je vais juste utiliser Collections.emptySet()
à la place:
FilterList emptyList = new FilterList(Collections.emptySet());
Cela me donne une erreur, en se plaignant qu' java.util.Set<java.lang.Object>
n'est pas un java.util.Set<java.lang.Integer>
. OK, comment à ce sujet:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
Cela me donne aussi une erreur! Ok, comment à ce sujet:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
Hey, ça fonctionne! Mais pourquoi? Après tout, Java n'a pas l'inférence de type, qui est pourquoi vous obtenez une unchecked conversion d'avertissement si vous ne Set<Integer> foo = new TreeSet()
au lieu de Set<Integer> foo = new TreeSet<Integer>()
. Mais Set<Integer> empty = Collections.emptySet();
fonctionne sans même un avertissement. Pourquoi est-ce?