Vamos a tener la siguiente jerarquía de clases:¿Error genérico de Java?
public class MyType {
}
public class MySuperclass<T extends MyType> {
protected Map<String, String> myMap = new TreeMap<String, String>();
protected String myMethod(String s) {
return myMap.get(s);
}
}
public class MySubclass extends MySuperclass {
@Override
protected String myMethod(String s) {
return myMap.get(s); // <-- compilation error
}
}
¿Por qué hay un error de compilación en el método de overriden MySubclass
? El mensaje de error es "No coinciden los tipos: no se puede convertir de Objeto a Cadena".
Lo interesante es que desaparece el error de compilación si defino genéricos tipo de clase de MySuperclass
en MySubclass
definición:
public class MySubclass extends MySuperclass<MyType> {
@Override
protected String myMethod(String s) {
return myMap.get(s);
}
}
Puede alguien explicar este comportamiento? Lo consideraría un error del compilador de Java.
Estoy usando jdk1.6.0_24.
exactamente. Ese fue uno de los "rompecabezas" de Bloch. – Bozho
¿Entonces los genéricos son todo o nada? Si usa un tipo sin procesar, no obtendrá ningún genérico para ese tipo, ni siquiera las partes que no dependen de 'T' en absoluto? – Thilo
Pero, ¿qué tiene la definición genérica de 'MySuperclass ** **' en común con los genéricos de 'Map ** ** myMap'? Esas son dos definiciones de genéricos diferentes sin ninguna 'conexión' entre ellas. No lo entiendo –