有人可以向我解释原因
@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).至于代码片段,它已经在上面,几乎; 以上扩展了以下内容.
签名与擦除后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,它们在类型擦除后是相同的,我们永远不会有冲突.因此,可以独立于现有的非通用代码来生成库.