这是由于 Java 如何实现协变返回类型。java.time.LocalTime
有一个minus
带有签名的方法
LocalTime minus(TemporalAmount amountToSubtract)
但是这个方法实现了一个java.time.temporal.Temporal
带有签名的接口方法
Temporal minus(TemporalAmount amount)
由于协变返回类型,这是允许的,但由于方法查找的工作方式,在运行时查找返回 aTemporal
的方法不会找到返回 a 的方法LocalTime
。因此,编译器创建了一个具有相同签名的通常禁止Temporal
的方法,但返回一个. 此方法调用返回LocalTime
. 在运行时,需要Temporal
返回类型的调用会找到桥接方法,一切正常。
这种桥接方法通常是不可见的,但它会出现在javap
输出中,导致您当前的困惑。
来源:http ://www.artima.com/weblogs/viewpost.jsp?thread=354443
这是javap -c
其中一个桥接方法的反汇编StringBuilder
,显示了它如何调用具有相同签名但更具体的返回类型的方法:
public java.lang.Appendable append(java.lang.CharSequence) throws java.io.IOException;
Code:
0: aload_0
1: aload_1
2: invokevirtual #6 // Method append:(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;
5: areturn