泛泛地重写 Java 中的方法
如果我有一个这样的基类,我无法更改:
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
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
}
}
也是不允许的,带有提供的提示。至少这个让我感到困惑,我认为Java应该做出决定:如果它是相同的返回类型,为什么不允许重写;如果不是,为什么我不能添加此方法?告诉我它是一样的,但不允许它被覆盖,这是非常奇怪的,基于常识。DuplicateMethod