【问题标题】:Method overloading with type erasure使用类型擦除的方法重载
【发布时间】: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


【解决方案1】:

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

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

无论如何,元点仍然存在。有声望的教科书出版商会维护勘误页,如果您需要澄清明显的错误,它们是一个很好的地方。

【讨论】:

  • 谢谢,这正是我想要的。我不知道勘误表。我会检查他们的
  • 其实在give链接的未确认勘误部分有说明
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多