AFAIK它不可能有一个具有相同呼叫签名的方法。但是:
$ javap -public java.time.LocalTime | grep "minus" | grep "Temporal" | grep -v "long"
public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
这些清楚地显示了具有相同呼叫签名的多种方法。
编辑:只保留相关位来简化问题。
答案 0 :(得分:6)
这是由于Java如何实现协变返回类型。 java.time.LocalTime
有minus
方法,带有签名
LocalTime minus(TemporalAmount amountToSubtract)
但是此方法实现了java.time.temporal.Temporal
带签名
Temporal minus(TemporalAmount amount)
由于协变返回类型,这是允许的,但由于方法查找的工作方式,在运行时查找返回Temporal
的方法将找不到返回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
答案 1 :(得分:2)
Java forbids two methods in the same class or interface with the same name and signature
但是,两个不同的类,接口或枚举可以具有相同的方法签名;例如,这是有效的:
public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
一个minus
方法属于LocalTime
类,另一个方法属于Temporal
接口。自LocalTime
implements Temporal
起,必须是这两者之间的签名匹配,否则合同未履行,这将导致编译错误。
答案 2 :(得分:0)
Temporal
是由LocalTime
实现的接口,因此它们的方法具有相同的签名
如果你想检查试试这个
javap java.time.LocalTime