Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带类型擦除的方法重载_Java_Generics_Overloading_Type Erasure - Fatal编程技术网

Java 带类型擦除的方法重载

Java 带类型擦除的方法重载,java,generics,overloading,type-erasure,Java,Generics,Overloading,Type Erasure,在Maurice Naftalin&Philip Wadler的《Java泛型和集合》一书中,第56页有一段代码与类型擦除的方法重载有关 它说,就像不允许两个具有相同签名的方法一样,我们也不能有两个具有相同类型擦除的不同方法。然后,它继续给出了一个简单的类来演示工作代码: class Overload{ public static int sum(List<Integer> ints){ int sum = 0; for(int i: ints) sum += i

在Maurice Naftalin&Philip Wadler的《Java泛型和集合》一书中,第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
基本上,作者写道,由于它们有不同的返回类型,Java可以区分它们,这是正常的。

然而,据我所知,方法的返回类型不是方法签名的一部分,当涉及到重载时,它是无关的。我还在Java8上测试了这段代码,并抛出了编译器错误。我的问题是,作者是在这句话中犯了错误,还是在旧版本的Java中允许使用这段代码?

这是教科书中的错误。作者已确认并(根据勘误表页)更正:

更新-实际上,我不确定我是否选择了正确的勘误表。页码(第50页)与您正在谈论的页码不匹配。但是如果你翻到“未确认勘误表”选项卡,第56页已经有一个


无论如何,元点仍然存在。著名的教科书出版商维护勘误表页面,如果您需要澄清一个明显的错误,可以在这里查看。

作者犯了一个错误。我想指出,这在JVM方面是正确的,返回类型可以确定您调用的方法(我们有一个
I(Ljava.util.List;)
和一个
Ljava.lang.String;(Ljava.util.List;)
;它们是不同的,但请注意已经发生了擦除),但就Java语言而言,这是错误的。事实上,这一事实使
javac
的生活更加艰难,因为它经常需要为泛型方法建立桥梁。谢谢,这正是我所寻找的。我不知道勘误表。我会检查它们的,实际上,它是在未经确认的勘误表一节中给出的链接
int sum(List)
String sum(List)