gpt4 book ai didi

java - 类型删除、覆盖和泛型

转载 作者:IT老高 更新时间:2023-10-28 20:51:56 26 4
gpt4 key购买 nike

谁能解释一下原因

@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 运行时环境,标准版(内部版本 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 覆盖父类(super class)方法这一事实,让我们看看发生类型删除时的运行时影响。我们现在有两个看起来完全一样的方法(相同的名称,相同的参数类型),但不会相互覆盖。如果它们不覆盖,它们必须在子类型上都作为单独的方法可用,但它们具有相同的运行时签名:冲突。所以 Java 必须禁止它。

允许使用原始参数类型覆盖泛型参数类型,因为原始类型的存在正是出于这个原因:它们是一种方便的机制,具有特定的不健全的类型规则,以适应与遗留代码的交互。所以这里的类型系统将决定子类方法确实覆盖父类(super class)方法,它们在类型删除后相同的,我们永远不会发生冲突。由于这个库可以独立于现有的非泛型代码进行泛型。

关于java - 类型删除、覆盖和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com