ここで何が起こっていて、それを理解していますか?彼らが正しく使用されてきたことを確認しています後ちなみにこれらの奇妙なオーバーライドルールを消去する方法を説明できますか?
class C<T> {
T id(T x) {
return null;
}
}
class D extends C<String> {
public Integer id(Integer x) { // compiles! but T shall be String ???
return 7;
}
}
public static void main(String[] args) {
System.out.println(new D().id("7")); // null
System.out.println(new D().id(7)); // 7
}
私はこのようなDを宣言した場合、コンパイルがName clash: The method id(Object) of type D has the same erasure as id(T) of type C<T> but does not override it:
class D extends C<String> {
public Object id(Object x) { // compile error !
return 7;
}
}
Nitpick:Cのidメソッドは、OPの例では公開されていません。 (まだ+1) –