栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java方法与类型中的另一个方法具有相同的擦除

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)方法。但是,当然,编译器需要解析一个方法。为了消除这种歧义,不允许类具有多个等效的方法-即,擦除后具有相同参数类型的多个方法。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400338.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号