簡體   English   中英

使用類型擦除重載方法

[英]Method overloading with type erasure

在Maurice Naftalin和Philip Wadler的書“Java Generics and Collections”中,有一個與第56頁的類型擦除方法重載有關的代碼。
它說,就像兩個具有相同簽名的方法一樣,不允許使用相同類型擦除的兩種不同方法。 然后它繼續並提供一個簡單的類來演示一個工作代碼:

class Overload{
  public static int sum(List<Integer> ints){
    int sum = 0;
    for(int i: ints) sum += i;
    return sum
  }
  public static String sum(List<String> strs){
    StringBuffer sum = new StringBuffer();
    for(String s: strings) sum.append(s);
    return sum.toString();
  }
}

assert sum(Arrays.asList(1, 2, 3)) == 6; //ok
assert sum(Arrays.asList("a", "b")).equals("ab"); //ok

然后給出兩種sum方法的擦除

int sum(List)
String sum(List)

基本上,作者寫道,由於它們具有不同的返回類型,Java可以區分它們並且沒關系。
但是,據我所知,方法的返回類型不是方法簽名的一部分,並且在重載時無關緊要。 我還在Java 8上測試了這段代碼,並拋出了編譯器錯誤。 我的問題是,作者是否對此聲明犯了錯誤,或者舊版Java中是否允許使用此代碼?

這是教科書中的一個錯誤。 作者已經承認並且(根據勘誤表頁面)更正了:

更新 - 實際上,我不確定我選擇了正確的錯誤。 頁碼(第50頁)與您正在談論的頁碼不匹配。 但是如果你翻到“未經證實的勘誤表”標簽,那么第56頁就已有一個。

無論如何,這一點仍然存在。 信譽良好的教科書出版商維護勘誤頁面,如果您需要澄清明顯的錯誤,它們是一個好看的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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