Rzućmy następujące klasy Hierarchia:Błąd generyczny 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
}
}
Dlaczego tam jest błąd kompilacji w nadpisane metody MySubclass
? Komunikat o błędzie "Niezgodność typu: nie można przekonwertować z obiektu na ciąg".
Interesującą rzeczą jest to, że bonusie błąd kompilacji, jeśli określenie klasy rodzajowych typ dla MySuperclass
w MySubclass
definicji:
public class MySubclass extends MySuperclass<MyType> {
@Override
protected String myMethod(String s) {
return myMap.get(s);
}
}
Może ktoś wyjaśnić to zachowanie? Uważam, że jest to błąd kompilatora Java.
Używam jdk1.6.0_24.
dokładnie. To był jeden z "puzzlerów" Blocha. – Bozho
A więc generics to wszystko czy nic? Jeśli używasz typu surowego, nie otrzymasz żadnych generycznych dla tego typu, nawet części, które w ogóle nie są zależne od 'T'? – Thilo
Ale co ma ogólną definicję 'MySuperclass ** **' wspólnego z rodzajami "Map ** ** myMap"? Są to dwie różne definicje rodzajowe bez "połączenia" między nimi. Nie rozumiem tego. –