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有所不同。