Es posible que sepa que un conjunto comodín ilimitado > Puede contener elementos de cualquier tipo, y un conjunto de tipo sin formato también puede contener elementos de cualquier tipo. ¿Cuál es la diferencia entre ellos?
1. Dos hechos sobre Set >
Hay dos hechos sobre Set >:
Ítem 1: ¿Desde el signo de interrogación? representa cualquier tipo. El conjunto > Es capaz de contener cualquier tipo de elementos.
Ítem 2: Debido a que no sabemos el tipo de?, No podemos poner ningún elemento en el Conjunto >
Entonces, un Conjunto > Puede contener cualquier tipo de elemento (Elemento 1), pero no podemos poner ningún elemento en él (Elemento 2). ¿Las dos declaraciones entran en conflicto entre sí? Por supuesto que no lo son. Esto se puede ilustrar claramente con los dos ejemplos siguientes:
El artículo 1 significa la siguiente situación:
//Legal Code public static void main(String[] args) { HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1, 2, 3)); printSet(s1); HashSet<String> s2 = new HashSet<String>(Arrays.asList("a", "b", "c")); printSet(s2); } public static void printSet(Set<?> s) { for (Object o : s) { System.out.println(o); } } |
Dado que Set > Puede contener cualquier tipo de elementos, simplemente usamos Object en el ciclo.
El artículo 2 significa la siguiente situación que es ilegal:
//Illegal Code public static void printSet(Set<?> s) { s.add(10);//this line is illegal for (Object o : s) { System.out.println(o); } } |
Debido a que no conocemos el tipo de > Exactamente, no podemos agregarle nada más que nulo. Por la misma razón, no podemos inicializar un conjunto con Set >. Lo siguiente es ilegal:
//Illegal Code Set<?> set = new HashSet<?>(); |
2. Establecer vs. Establecer >
¿Cuál es la diferencia entre el conjunto de tipo sin formato y el conjunto de caracteres comodín ilimitado >?
Esta declaración de método está bien:
public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); } } |
porque el tipo crudo no tiene restricciones. Sin embargo, esto corromperá fácilmente el invariante de la colección.
En resumen, el tipo comodín es seguro y el tipo sin formato no lo es. No podemos poner ningún elemento en un Conjunto >.
3. ¿Cuándo es útil Establecer >?
Cuando desee utilizar un tipo genérico, pero no sepa o no le importe cuál es el tipo real del parámetro, puede utilizar >[1]. Solo se puede utilizar como parámetros para un método.
Por ejemplo:
public static void main(String[] args) { HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1,2,3)); HashSet<Integer> s2 = new HashSet<Integer>(Arrays.asList(4,2,3)); System.out.println(getUnion(s1, s2)); } public static int getUnion(Set<?> s1, Set<?> s2){ int count = s1.size(); for(Object o : s2){ if(!s1.contains(o)){ count++; } } return count; } |
Referencia:
1. Bloch, Joshua. Java efectivo. Addison-Wesley Professional, 2008.