在书中,#Java; Java Generics and Collections"作者:Maurice Naftalin& Philip Wadler第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中是否允许使用此代码?
答案 0 :(得分:3)
这是教科书中的一个错误。作者已经承认并且(根据勘误表页面)更正了:
更新 - 实际上,我不确定我选择了正确的错误。页码(第50页)与您正在谈论的页码不匹配。但如果你转向未经证实的勘误&#34;选项卡,第56页已有一个。
无论如何,这一点仍然存在。信誉良好的教科书出版商维护勘误表页面,如果您需要澄清明显的错误,它们是一个好看的地方。