このような変更できない基本クラスがある場合:
public abstract class A {
public abstract Object get(int i);
}
そして、私は次のようなクラスでそれを拡張しようとしB
ます:
public class B extends A{
@Override
public String get(int i){
//impl
return "SomeString";
}
}
全て大丈夫。しかし、次のようにすると、より一般的なものにしようとして失敗します。
public class C extends A{
@Override
public <T extends Object> T get(int i){
//impl
return (T)someObj;
}
}
これを禁止する理由が思いつきません。私の理解では、ジェネリック型T
は にバインドされており、Object
これは の要求された戻り値の型ですA
。戻り値の型としてString
orを の中に入れることができるのに、クラスの中に入れることができないのはなぜですか?AnyObject
B
<T extends Object> T
C
私の観点からすると、別の奇妙な動作は、次のような追加のメソッドです。
public class D extends A{
@Override
public Object get(int i){
//impl
}
public <T extends Object> T get(int i){
//impl
}
}
も許可されていませんDuplicateMethod
。少なくともこれは私を混乱させます.Javaは決定を下すべきだと思います.同じ戻り値の型である場合は、オーバーライドを許可しないでください. そうでない場合、このメソッドを追加できないのはなぜですか? 常識に基づいて、同じであるがオーバーライドできないと言うのは非常に奇妙です。