lo tanto, tengo una clase con un constructor de esta manera:¿Por qué el uso de Collections.emptySet() con genéricos funciona en la asignación pero no como un parámetro de método?
public FilterList(Set<Integer> labels) {
...
}
y quiero construir un nuevo FilterList
objeto con un conjunto vacío. Siguiendo el consejo de Joshua Bloch en su libro Effective Java, no quiero crear un nuevo objeto para el conjunto vacío; Voy a usar Collections.emptySet()
lugar:
FilterList emptyList = new FilterList(Collections.emptySet());
Esto me da un error, quejándose de que no es un java.util.Set<java.lang.Object>
java.util.Set<java.lang.Integer>
. OK, qué tal esto:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
¡Esto también me da un error! Bien, ¿qué tal esto:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
Hey, funciona! ¿Pero por qué? Después de todo, Java no tiene inferencia de tipo, por lo que obtienes una advertencia de conversión no verificada si haces Set<Integer> foo = new TreeSet()
en lugar de Set<Integer> foo = new TreeSet<Integer>()
. Pero Set<Integer> empty = Collections.emptySet();
funciona sin siquiera una advertencia. ¿Porqué es eso?
todas las respuestas a continuación son correctos, pero lo que no entiendo es: ¿por qué se inicialice su colección con una lista vacía en lugar de llamar a un constructor predeterminado sin parámetros? Cada colección que conozco tiene un constructor con una colección existente y un constructor vacío. –
Curiosamente, lo siguiente HACE compilar: 'FilterList emptyList = new FilterList ((Set) (Establecer Extends Object>) Collections.emptySet());' –
EricS
Otro ejemplo bastante divertido: 'Set emptySet = (Set ) Collections.emptySet(); 'no se compila. –
neo