que estaba buscando en el Java Generics documentation y encontré esta pieza de código,Java Genéricos Lista de captura <?>
public class WildcardError {
void foo(List<?> l) {
//This give a compile time error
l.set(0,l.get(0));
}
}
puedo entender que estamos ir a buscar un elemento de una List<?>
y tratando de ponerlo en otra List<?>
. Entonces el compilador da un error. Mi pregunta es que tiene sentido cuando las 2 listas son diferentes, es decir, l.set(0, m.get(0))
aquí listas l
y m
son diferentes. Pero en el ejemplo anterior, l
y l
son las mismas listas. ¿Por qué el compilador no es lo suficientemente inteligente como para ver eso? ¿Es difícil implementarlo?
Editar: Soy consciente de que puedo solucionarlo mediante un método de ayuda o mediante el uso de T
en lugar de un ?
. Me pregunto por qué el compilador no lo hace por mí.
Me he estado preguntando sobre una razón formal para esto durante mucho tiempo. Personalmente siento que esta es una característica que falta en el JLS, ya que los dos comodines en ambos 'l' son formalmente iguales. Al menos por intuición ... Pero probablemente, en piezas de código más complejas, sería más difícil reconocer comodines "idénticos" –
Sí. Probablemente haya algunos casos de esquina interesantes que obligarían a la especificación a ser bastante compleja. Buena pregunta sin embargo. Es una especie de generalización de esta pregunta. Debe publicarlo como seguimiento. – aioobe
Bien, esta es la pregunta: http://stackoverflow.com/questions/11500385/how-does-the-jls-justify-the-wildcards-cannot-bellyly-used-within-methods –