这是由于 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