Por favor, dame una pista sobre lo que está pasando aquí:genéricos de fantasía captura de colisión
List<? extends Number> a = new ArrayList<Number>();
List<? extends Number> b = new ArrayList<Number>();
a.addAll(b); // ouch! compiler yells at me, see the block below:
/*
incompatible types
found : java.util.List<capture#714 of ? extends java.lang.Number>
required: java.util.List<java.lang.Number>
*/
Este simple código no compila. Recuerdo vagamente algo relacionado con las capturas de tipo, como las que deberían usarse principalmente en las especificaciones de la interfaz, no el código real, pero nunca me quedé estupefacto.
Por supuesto, esto podría ser fijo bruto-fuerza, al igual que:
List<? extends Number> a = new ArrayList<Number>();
List<? extends Number> b = new ArrayList<Number>();
@SuppressWarnings({"unchecked"})
List<Number> aPlain = (List<Number>) a;
@SuppressWarnings({"unchecked"})
List<Number> bPlain = (List<Number>) b;
aPlain.addAll(bPlain);
es así, no me realmente que o bien renunciar a las capturas en la declaración (la captura me vino de una interfaz, así que tendré que cambiar alguna API), o seguir con los moldes de tipo con anotaciones de supresión (que generalmente apestan y complican un poco el código).
Hola, ¿por qué no declarar 'a' 'como Lista a = new ArrayList () '? –
Axel
Bueno, tengo una API que ya declara esta captura cuando me devuelve una lista. Utilizo un constructor solo para simplificar las cosas y hacerlas un poco más oscuras (desinteresadamente). –