Java 带类型擦除的方法重载
在Maurice Naftalin&Philip Wadler的《Java泛型和集合》一书中,第56页有一段代码与类型擦除的方法重载有关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
它说,就像不允许两个具有相同签名的方法一样,我们也不能有两个具有相同类型擦除的不同方法。然后,它继续给出了一个简单的类来演示工作代码:
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中允许使用这段代码?这是教科书中的错误。作者已确认并(根据勘误表页)更正:
无论如何,元点仍然存在。著名的教科书出版商维护勘误表页面,如果您需要澄清一个明显的错误,可以在这里查看。作者犯了一个错误。我想指出,这在JVM方面是正确的,返回类型可以确定您调用的方法(我们有一个
I(Ljava.util.List;)
和一个Ljava.lang.String;(Ljava.util.List;)
;它们是不同的,但请注意已经发生了擦除),但就Java语言而言,这是错误的。事实上,这一事实使javac
的生活更加艰难,因为它经常需要为泛型方法建立桥梁。谢谢,这正是我所寻找的。我不知道勘误表。我会检查它们的,实际上,它是在未经确认的勘误表一节中给出的链接
int sum(List)
String sum(List)