【发布时间】:2018-04-14 23:37:42
【问题描述】:
在 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
那么两个sum方法的擦除被给出为
int sum(List)
String sum(List)
基本上,作者写道,由于它们有不同的返回类型,Java 可以区分它们,这没关系。
但是,据我所知,方法的返回类型不是方法签名的一部分,并且与重载无关。我还在 Java 8 上测试了这段代码,并引发了编译器错误。我的问题是,作者是否在此声明中犯了错误,或者该代码在旧版本的 Java 中是否允许?
【问题讨论】:
-
作者搞错了。
-
我想指出,这在 JVM 方面是正确的,其中返回类型可以确定您调用的方法(我们有一个
I(Ljava.util.List;)和一个Ljava.lang.String;(Ljava.util.List;);它们是不同,但请注意擦除已经发生),但在 Java 语言方面是错误的。事实上,这一事实让javac的生活更加艰难,因为它经常需要为泛型方法创建桥梁。
标签: java generics overloading type-erasure