簡體   English   中英

Java類有兩個具有相同函數簽名但返回類型不同的方法

[英]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);

這些清楚地顯示了具有相同呼叫簽名的多種方法。

  1. Java如何解析函數調用?
  2. 為什么有多種功能?

編輯:通過僅保留相關位簡化問題。

這是由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM