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

Java泛型方法重写

边意
2023-03-14
abstract class A {
    abstract public void dosome(Class<? extends Number> c);
}

class B extends A {
    @Override
    public void dosome(Class<Number> c) {}
}

来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。

方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。

是对一个

dosome(Class<Number> c)?

如果是这样,什么是错的?

EDIT1:或者如果我切换通用类型:

abstract class A {
    abstract public void dosome(Class<Number> c);
}

class B extends A {
    @Override
    public void dosome(Class<? extends Number> c) {}
}

这种情况下有什么问题?

EDIT2:我知道如何修复它,但我想了解,在这种情况下,根据java规则,什么是错误的。

共有2个答案

淳于泓
2023-03-14

方法doome抽象类中,调用者可以选择调用任何类型的,只要它是某种类型的数字

abstract public void dosome(Class<? extends Number> c);

但是您像这样重写了该方法

public void dosome(Class<Number> c) {}

这将阻止用户调用任何类型的Number,这意味着您不能使用integer类型调用。

根据覆盖规则,您不能更改方法参数。所以

舒仲渊
2023-03-14

如果您希望能够根据每个参数类型都必须扩展的公共基类型来定义子类中的具体参数类型,您必须编写以下内容

abstract class A<T extends Number> {
    abstract public void dosome(Class<T> c);
}

class B extends A<Number> {
    @Override
    public void dosome(Class<Number> c) {}
}

代码的问题在于的特殊含义?扩展数字描述具有给定“上限”的“未知”类型,当您不关心或无法获得具体类型时,可以使用该上限。

 类似资料:
  • 我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。 基本泛型类: 儿童班: 实施: 我想在其中覆盖参数化方法的子视图类: 这是Eclipse抛出错误消息的地方: 注意类和接口:事件和级别: 以及继承自 的 Model 类 我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdap

  • 这是如何编译的: 但这并不是: 它给我以下编译错误: Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数) 错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个 擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?

  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代

  • Main.java:12:错误:TextMessage不是抽象的,并且不会覆盖Message类中的抽象方法setContent(T)TextMessage扩展Message{^其中T是类型变量:T扩展方法setContent(T)中声明的Object 1错误

  • 我有以下两种方法: ClassA和ClassB都有相同的方法getObjValue,但它们没有关系。它们不从公共类或接口继承。由于这些方法几乎是相同的,我是否可以使用泛型来使用一个签名如下的方法来消除这段代码的重复: