【发布时间】:2016-07-07 16:53:29
【问题描述】:
我有两个类似这样的界面:
interface Parent<T extends Number> {
T foo();
}
interface Child<T extends Integer> extends Parent<T> {
}
如果我有一个原始的Parent 对象,调用foo() 默认返回一个Number,因为没有类型参数。
Parent parent = getRawParent();
Number result = parent.foo(); // the compiler knows this returns a Number
这是有道理的。
如果我有一个原始的Child 对象,我希望调用foo() 会以相同的逻辑返回一个Integer。但是,编译器声称它返回一个Number。
Child child = getRawChild();
Integer result = child.foo(); // compiler error; foo() returns a Number, not an Integer
我可以在Child 中覆盖Parent.foo() 来解决此问题,如下所示:
interface Child<T extends Integer> extends Parent<T> {
@Override
T foo(); // compiler would now default to returning an Integer
}
为什么会这样?有没有办法让Child.foo() 默认返回Integer 而不会覆盖Parent.foo()?
编辑:假装Integer 不是最终的。我只是选择了Number 和Integer 作为示例,但显然它们不是最佳选择。 :S
【问题讨论】:
-
我认为这是因为没有孩子的覆盖,孩子继承了父母的
foo方法,并且根据父母的说法,T是Number。要让父级中的foo返回Integer,它需要知道有关其子类的信息,这会破坏层次结构... -
试试
interface Child<T extends Integer> extends Parent<T extends Integer> -
@fukanchik 这甚至不是有效的 Java。
-
@AdamGent 谢谢你是对的,它无法编译。我查看了 JLS
Chapter 4. Types, Values, and Variables并找不到它说这里不允许上限的确切点。 -
@fukanchik 这是type argument。
标签: java generics polymorphism subclass covariance