程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java方法与类型中的另一个方法具有相同的擦除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java方法与类型中的另一个方法具有相同的擦除?

开发过程中遇到Java方法与类型中的另一个方法具有相同的擦除的问题如何解决?下面主要结合日常开发的经验,给出你关于Java方法与类型中的另一个方法具有相同的擦除的解决方法建议,希望对你解决Java方法与类型中的另一个方法具有相同的擦除有所启发或帮助;

该规则旨在避免在仍使用原始类型的旧代码中发生冲突。

这是从JLS得出的为什么不允许这样做的说明。假设在将泛型引入Java之前,我编写了如下代码:

class CollectionConverter {
  List toList(Collection C) {...}
}

你可以像这样扩展我的课程:

class OverrIDer extends CollectionConverter{
  List toList(Collection C) {...}
}

引入泛型之后,我决定更新我的库。

class CollectionConverter {
  <T> List<T> toList(Collection<T> C) {...}
}

你还没有准备好进行任何更新,因此你不理会OverrIDer课程。为了正确地覆盖此toList()方法,语言设计人员认为原始类型对于任何泛型类型都是“覆盖等效”的。这意味着,尽管你的方法签名在形式上不再与我的超类的签名相等,但你的方法仍会被覆盖。

现在,时间流逝,你决定准备好上课了。但是你花了一点时间,而不是编辑现有的原始toList()方法,而是添加了一个新方法,如下所示:

class OverrIDer extends CollectionConverter {
  @OverrIDe
  List toList(Collection C) {...}
  @OverrIDe
  <T> List<T> toList(Collection<T> C) {...}
}

由于原始类型的覆盖等效性,因此这两种方法都具有有效的形式来覆盖该toList(Collection)方法。但是,当然,编译器需要解析一个方法。为了消除这种歧义,不允许类具有多个等效的方法-即,擦除后具有相同参数类型的多个方法。

关键是这是一种语言规则,旨在维护使用原始类型与旧代码的兼容性。这不是擦除类型参数所要求的限制;因为方法解析是在编译时发生的,所以将泛型添加到方法标识符中就足够了。

解决方法

为什么在同一个类中使用以下两种方法是不合法的?

class Test{
   void add(Set<Integer> ii){}
   void add(Set<String> ss){}
}

我得到了 compilation error

方法add(Set)与类型Test中的另一个方法具有相同的擦除add(Set)。

然我可以解决它,但我想知道为什么javac不喜欢这样。

我可以看到,在很多情况下,这两种方法的逻辑非常相似,可以用一个方法代替

public void add(Set<?> set){}

方法,但并非总是如此。

如果你想让两个带有constructors这些参数,这会特别令人讨厌,因为那样你就不能只更改其中一个的名称constructors

大佬总结

以上是大佬教程为你收集整理的Java方法与类型中的另一个方法具有相同的擦除全部内容,希望文章能够帮你解决Java方法与类型中的另一个方法具有相同的擦除所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。