Hen*_*aul 36 java generics overriding type-erasure
有人可以向我解释原因
@Override
public void fooMethod(Class<?> c)
Run Code Online (Sandbox Code Playgroud)
不会覆盖
public void fooMethod(Class c)
Run Code Online (Sandbox Code Playgroud)
并给我以下错误:
- 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).至于代码片段,它已经在上面,几乎; 以上扩展了以下内容.
elj*_*nso 47
签名与擦除后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,它们在类型擦除后是相同的,我们永远不会有冲突.因此,可以独立于现有的非通用代码来生成库.
| 归档时间: |
|
| 查看次数: |
22949 次 |
| 最近记录: |