0

这就是例子。

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

对于 class Childjavac产生两个名为 的方法foo

  1. 第一个foo()返回ChildReturnType,它的主体是我们在Child.foo()
  2. 第二个foo()返回ParentReturnType,它只是调用第一个foo()

我不太明白为什么javac会产生两个版本的foo().

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

4

1 回答 1

1

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

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

拼图的最后一块是 Java 识别在编译时而不是在运行时调用哪个 JVM 签名。因此,编译器确定应该调用这些方法中的哪一个,并且当泛型添加到 java 中时,设计目标是尽量减少对运行时的更改。也就是说,尽可能多地在编译器阶段完成,因此虽然可以设想其他不涉及生成两种方法的解决方案,但鉴于工具已经可用且时间尺度,这样做是务实的。

于 2013-03-06T06:03:52.077 回答