使用类型擦除重载方法

时间:2018-04-14 23:37:43

标签: java generics overloading type-erasure

在书中,#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中是否允许使用此代码?

1 个答案:

答案 0 :(得分:3)

这是教科书中的一个错误。作者已经承认并且(根据勘误表页面)更正了:

更新 - 实际上,我不确定我选择了正确的错误。页码(第50页)与您正在谈论的页码不匹配。但如果你转向未经证实的勘误&#34;选项卡,第56页已有一个。

无论如何,这一点仍然存在。信誉良好的教科书出版商维护勘误表页面,如果您需要澄清明显的错误,它们是一个好看的地方。