具有泛型子类化的 Java 自动返回类型协方差
我有两个看起来像这样的接口:
interface Parent<T extends Number> {
T foo();
}
interface Child<T extends Integer> extends Parent<T> {
}
如果我有一个原始对象,则调用默认为返回 a,因为没有类型参数。Parent
foo()
Number
Parent parent = getRawParent();
Number result = parent.foo(); // the compiler knows this returns a Number
这是有道理的。
如果我有一个原始对象,我希望调用将按相同的逻辑返回 a。但是,编译器声称它返回一个 .Child
foo()
Integer
Number
Child child = getRawChild();
Integer result = child.foo(); // compiler error; foo() returns a Number, not an Integer
我可以覆盖 in 来解决此问题,如下所示:Parent.foo()
Child
interface Child<T extends Integer> extends Parent<T> {
@Override
T foo(); // compiler would now default to returning an Integer
}
为什么会发生这种情况?有没有办法让默认返回 不覆盖 ?Child.foo()
Integer
Parent.foo()
编辑:假装不是最终的。我只是选择并作为例子,但显然它们不是最好的选择。:SInteger
Number
Integer