types擦除,覆盖和generics
有人可以向我解释为什么
@Override public void fooMethod(Class<?> c)
不会覆盖
public void fooMethod(Class c)
并给我以下错误,而不是:
- 名称冲突:方法fooMethod(Class <?>) typesSubClass与fooMethod(Class)的擦除次数相同 键入SuperClass但不覆盖它 - types的方法fooMethod(Class <?>) 子类必须重写一个超类方法
?
编辑: “ java -version
”说Java(TM)2运行时环境,标准版(版本1.5.0_16-b06-284)。 至于代码片段,它已经在上面了,非常多; 以上延伸下面的一个。
fooMethod(Class<?>)
, fooMethod(Class<?>)
的签名与fooMethod(Class)
的签名相同,因为Class<?>
的删除只是Class
( JLS 4.6 )。 因此, fooMethod(Class)
是fooMethod(Class<?>)
的子签名,但不是相反的( JLS 8.4.2 )。
要覆盖实例方法,您需要重写方法作为重写方法的子签名( JLS 8.4.8.1 )。 这显然不是这种情况。
现在我们已经确定了子类方法不会根据JLS覆盖超类方法,让我们来看看发生types擦除时的运行时影响。 我们现在有两个方法看起来是完全相同的(相同的名称,相同的参数types),但不相互覆盖。 如果它们不覆盖,它们必须作为单独的方法在子types上可用,但它们具有相同的运行时签名:冲突。 所以Java必须禁止它。
允许使用原始参数types覆盖通用参数types,因为存在原始types正是出于这个原因:它们是一个方便的机制,具有特定的不合适的types规则以适应与遗留代码的交互。 因此,这里的types系统将决定子类方法重写超类,它们在types擦除后是相同的,我们永远不会有冲突。 由于这个库可以被独立于现有的非通用代码而被基因化。
因为Class<?>
比Class
更具体。
例如, foo(Class<List>)
不能覆盖foo(Class<Collection>)
。 我忘了这个术语,但是generics的types总是和那些没有generics的types有所不同。