以下のスニペットを検討してください。ジェネリック型に関してオーバーライドがどのように機能するか、および戻り値の型List<String>
(たとえば) がオーバーライドできる理由を理解していますList<? extends Object>
。ただし、1 や 2 などのステートメントがコンパイルに失敗する理由は完全にはわかりません...ここでも継承が適用されるべきではないのでしょうか?
public class Generics {
public static void main(String[] args) {
A instance = new B();
X instance2 = new Y();
Map<String, String> map = instance2.getMap(); // 1
List<String> list = instance.getList(); // 2
}
}
class A {
List<? extends Object> getList() {
return null;
}
}
class B
extends A {
List<String> getList() {
return new LinkedList<String>();
}
}
class X {
Map<String, ? extends Object> getMap() {
return null;
}
}
class Y
extends X {
@Override
Map<String, String> getMap() {
return null;
}
}