[英]Java 8 -Two interfaces contain default methods with the same method signature but different return types, how to override?
[英]Java class has 2 methods with the same function signature but different return types
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);
這些清楚地顯示了具有相同呼叫簽名的多種方法。
編輯:通過僅保留相關位簡化問題。
這是由於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
這是來自StringBuilder
一個橋接方法的javap -c
反匯編,顯示了它如何使用相同的簽名調用該方法,但更具體的返回類型:
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
Java禁止在具有相同名稱和簽名的同一類或接口中使用兩種方法 。
但是,兩個不同的類,接口或枚舉可以具有相同的方法簽名; 例如,這是有效的:
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
實現Temporal
,因此必須在這兩者之間存在簽名匹配,否則合同將不會完成,這將導致編譯錯誤。
Temporal
是由LocalTime
實現的接口,因此如果要檢查嘗試,它們的方法具有相同的簽名
javap java.time.LocalTime
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.