2010-08-04 12 views
8

Tengo un problema con los comodines anidados acotados en los genéricos de Java.El comodín anidado Java genérico no compilará

Aquí es un caso común:

public void doSomething(Set<? extends Number> set) {} 

public void callDoSomething() { 
    Set<Integer> set = new HashSet<Integer>(); 
    doSomething(set); 
} 

Ésta es genéricos estándar de Java, funciona bien.

Sin embargo, si el comodín se convierte anidado, ya no funciona:

public void doSomething(Map<String, Set<? extends Number>> map) {} 

public void callDoSomething() { 
    Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>(); 
    doSomething(map); 
} 

Esto conduce a un error de compilación.

He intentado una variedad de moldes y permutaciones de comodines, pero no puedo hacerlo funcionar. No recuerdo haber visto este problema antes, y he trabajado con genéricos durante años. ¿Estoy demasiado cansado y me falta algo obvio?

+0

Hay una explicación para esto en las Preguntas frecuentes sobre genéricos de Java: http://www.angelikalanger.com/GenericsFAQ/FAQSecciones /TypeArguments.html#FAQ104 –

Respuesta

15

Así que el problema es, doSomething podrían implementarse como:

public void doSomething(Map<String, Set<? extends Number>> map) { 
    Set<Float> set = ...; 
    map.put("xyz", set); 
} 

Usted necesita decidir lo que realmente quiere decir.

Probablemente algo como:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {} 
+0

Sí, de forma independiente me di cuenta de esto. Podría jurar que lo intenté ayer, pero probablemente tuve algún otro cambio sutil. – nilskp

0

Para hacer que el código funcione Crear HashMap como:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>(); 
1

esto va a funcionar para usted:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {} 
Cuestiones relacionadas