这是一个例子。
class ParentReturnType {}
class ChildReturnType extends ParentReturnType {}
class Parent {
ParentReturnType foo() {...}
}
class Child<R extends ChildReturnType> extends Parent {
@Override
R foo() {...}
}
对于课程Child
,javac
会生成两个名为foo
的方法:
foo()
返回ChildReturnType
,其正文是我们在Child.foo()
中定义的foo()
会返回ParentReturnType
,只会调用第一个foo()
我不太明白为什么javac
生成两个版本的foo()
。
我相信foo()
的一个版本返回ParentReturnType
,其R foo()
(在源代码中)定义的正文就足够了。
答案 0 :(得分:1)
这是因为JVM与Java语言不同,它包含返回类型作为方法标识的一部分。
因此在Java中,不可能通过返回类型覆盖方法(它必须通过输入args)。但是在JVM世界中这样做是合法的。
拼图的最后一部分是Java识别在编译时而不是在运行时调用哪个JVM签名。因此,编译器可以识别应该调用哪些方法,并且当将泛型添加到Java时,设计目标是最小化对运行时的更改。也就是说,尽可能在编译器阶段完成,因此虽然可以设想其他不涉及生成两种方法的解决方案,但考虑到已有的工具和时间尺度,这样做是务实的。