当前位置:  开发笔记 > 编程语言 > 正文

键入擦除,覆盖和泛型

如何解决《键入擦除,覆盖和泛型》经验,为你挑选了1个好方法。

有人可以向我解释原因

@Override
public void fooMethod(Class c)

不会覆盖

public void fooMethod(Class c)

并给我以下错误:

 - Name clash: The method fooMethod(Class) 
of type SubClass has the same erasure as fooMethod(Class) of 
type SuperClass but  does not override it

 - The method fooMethod(Class) of type 
SubClass must override a superclass method

编辑: " java -version"Java(TM)2 Runtime Environment,Standard Edition(build 1.5.0_16-b06-284).至于代码片段,它已经在上面,几乎; 以上扩展了以下内容.



1> eljenso..:

签名与擦除后fooMethod(Class)的签名相同fooMethod(Class),因为擦除Class是简单的Class(JLS 4.6).因此,fooMethod(Class)是一个副本fooMethod(Class)而不是相反的(JLS 8.4.2).

要覆盖实例方法,您需要覆盖方法作为重写方法的子签名(JLS 8.4.8.1).这显然不是这种情况.

现在我们已经确定了你的子类方法没有根据JLS覆盖超类方法的事实,让我们看一下类型擦除发生时的运行时影响.我们现在有两个方法看起来完全相同(相同的名称,相同的参数类型),但不要互相覆盖.如果它们不覆盖,则它们必须在子类型上作为单独的方法可用,但它们具有相同的运行时签名:冲突.所以Java必须禁止它.

使用原始参数类型重写泛型参数类型允许的,因为只是因为这个原因存在的原始类型:他们是一个方便的机制不健全特定类型的规则,以适应与遗留代码的交互.所以这里的类型系统将决定子类方法是否覆盖超类1,它们在类型擦除后相同的,我们永远不会有冲突.因此,可以独立于现有的非通用代码来生成库.


这回答了这个问题,但却引出了一个后续问题:当你在子类中使用`class`时,你怎么做不可避免的警告呢?`类是原始类型.对泛型类型的引用应该参数化.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有