为什么'javac'生成两个具有相同名称/参数但泛型不同返回类型的方法?

时间:2013-03-06 05:48:39

标签: generics jvm javac

这是一个例子。

class ParentReturnType {}
class ChildReturnType extends ParentReturnType {}
class Parent {
  ParentReturnType foo() {...}
}
class Child<R extends ChildReturnType> extends Parent {
  @Override
  R foo() {...}
}

对于课程Childjavac会生成两个名为foo的方法:

  1. 第一个foo()返回ChildReturnType,其正文是我们在Child.foo()中定义的
  2. 第二个foo()会返回ParentReturnType,只会调用第一个foo()
  3. 我不太明白为什么javac生成两个版本的foo()

    我相信foo()的一个版本返回ParentReturnType,其R foo()(在源代码中)定义的正文就足够了。

1 个答案:

答案 0 :(得分:1)

这是因为JVM与Java语言不同,它包含返回类型作为方法标识的一部分。

因此在Java中,不可能通过返回类型覆盖方法(它必须通过输入args)。但是在JVM世界中这样做是合法的。

拼图的最后一部分是Java识别在编译时而不是在运行时调用哪个JVM签名。因此,编译器可以识别应该调用哪些方法,并且当将泛型添加到Java时,设计目标是最小化对运行时的更改。也就是说,尽可能在编译器阶段完成,因此虽然可以设想其他不涉及生成两种方法的解决方案,但考虑到已有的工具和时间尺度,这样做是务实的。