当前位置: 首页 > 知识库问答 >
问题:

覆盖泛型类的方法时名称冲突

孙德宇
2023-03-14

我正在尝试理解使用以下代码得到的名称冲突错误:

import java.util.*;
import javax.swing.*;

class Foo<R extends Number> {
    public void doSomething(Number n, Map<String, JComponent> comps) {
    }
}

class Bar extends Foo {
    public void doSomething(Number n, Map<String, JComponent> comps) {
    }
}

错误消息:

错误:名称冲突:doThings(数字,地图

我知道我可以通过从Foo中删除泛型类型,或者将Bar声明更改为class Bar extensed Foo来修复它

我知道我之前已经向父类添加了泛型类型,但只得到了关于子类的警告,而没有错误。有人能解释一下这种情况吗?


共有1个答案

壤驷坚
2023-03-14

Luiggi的评论是对的。这是原始类型的结果。

类的超类型可以是原始类型。类的成员访问被视为正常,超类型的成员访问被视为原始类型。在类的构造函数中,对super的调用被视为对原始类型的方法调用。

这在调用超类型方法时适用,但在重写超类型方法时也适用。

以以下为例

class Bar extends Foo {
    public Bar() {
        doSomething(1, new HashMap<Number, String>());
    }
}

您会注意到它编译,即使HashMap

未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4、§9.4)或非静态字段(§8.3)的类型是原始类型,对应于在与C相对应的泛型声明中删除其类型。

(请注意,在我们的例子中,CBar。)

尝试重写方法时也会发生同样的情况。试图覆盖Foo doSomething(..)时方法,您的Bar类实际上看到它被声明为

public void doSomething(Number n, Map comps) {
}

换句话说,类型参数的每次使用都会被删除。因此,尝试声明该方法

public void doSomething(Number n, Map<String, JComponent> comps) {
}

在子类型Bar中,实际上是尝试重载,而不是覆盖。这会因为类型擦除而失败。您可以使用@Overder验证正确的覆盖是

public void doSomething(Number n, Map comps) {
}

进一步阅读:

  • 什么是原始类型?为什么我们不应该使用它
 类似资料:
  • 问题内容: 我对此有不同的疑问,但是我仍然觉得这个话题很混乱。 我要做的就是拥有一个实现接口的抽象类,并具有一个扩展此抽象类的类,以便硬类需要实现and ,而无需其他方法,因为该方法位于抽象类中。 我有以下界面。 还有这个抽象类 我想这样使用 但是,我得到 为什么没有正确覆盖它? 更新 感谢@Bozho,解决方案是这样的: 问题答案: 我建议使接口通用,而不仅仅是其方法: 然后

  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8

  • 我定义了一个通用的环境特征: 为此,我提供了以下实现: 此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法: 对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。 然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]: 错误:方法e

  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符