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
}
}
MySubclass
のオーバーライドされたメソッドにコンパイルエラーがあるのはなぜですか? エラーメッセージは「型の不一致:オブジェクトから文字列に変換できません」です。
MySubclass
の定義で
MySuperclass
のジェネリッククラスの型を定義すると、コンパイルエラーが消えてしまうことです。
public class MySubclass extends MySuperclass<MyType> {
@Override
protected String myMethod(String s) {
return myMap.get(s);
}
}
誰かがこの動作を説明できますか?私はそれをJavaコンパイラのバグとみなします。
私はjdk1.6.0_24を使用しています。
。それはブロッホの「困惑者」の1人でした。 – Bozho
だからジェネリックは何でもいいですか?生の型を使うと、その型のジェネリックは得られません。 'T 'に全く依存しない部分もありません。 – Thilo
しかし、 'Map ** ** myMap'のジェネリックと共通する' MySuperclass ** ** 'という一般的な定義は何ですか?それらは2つの異なるジェネリック定義で、それらの間には「接続」はありません。理解できません。 –