[英]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.