He descubierto los siguientes problemas con genéricos. Considere la interfaz genéricaAccediendo a argumentos de tipo de tipos genéricos utilizados en typebounds
public interface A<X> {
X get();
void doStuff(X x);
}
Ahora, vamos a suponer la siguiente definición del método:
public <T extends A<?>> void foo(T t) {
bar(t);
}
Debido al carácter comodín, la información de tipo para el tipo de retorno de get() es insuficiente. Por lo tanto, tengo que delegar a otro método que "se une" este comodín para una variable de tipo fresco:
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
No se permite la invocación de bar() en foo, el compilador genera el mensaje de error:
la barra de método (a) en el ensayo de tipo no es aplicable para los argumentos (T)
sin embargo, si cambio de la foo() para
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
funciona. ¿Por qué? ¿Es esto un error del compilador? Cualquier comentario sobre esto sería muy apreciado.
Notas:
- La razón por la que no se limitan a declarar el método foo foo como nula (a), que en realidad estoy usando el interesection cota de tipo superior (&).
- La razón por la que no declaro X como una variable de tipo en foo() es que realmente tengo el problema a nivel de clase y no quiero aumentar innecesariamente el número de parámetros de tipo de esta clase.
¿Está utilizando el indicador de compilador -Xlint? Si no, intente compilar con ese –
No cambia nada ... – misberner
Estoy de acuerdo con @kan. El compilador de java lo hace, de hecho compila esto. Usé 1.6.0_27. Eclipse da el error exacto que le diste, ¿entonces tal vez lo está usando? –