Java泛型方法重写

标签 java generics overriding

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)相同。

是删除A

dosome(Class<Number> c)?

如果是的话,哪里出了问题?

编辑1: 或者如果我切换通用类型:

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

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

这种情况出了什么问题?

编辑2:我知道如何修复它,但我想了解,根据java规则,在这种情况下出了什么问题。

最佳答案

如果您希望能够根据每个参数类型必须扩展的公共(public)基类型在子类中定义具体参数类型,则必须编写类似的内容

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) {}
}

你的代码的问题是的特殊含义? extends Number 描述具有给定“上限”的“未知”类型,当您不关心或无法获取具体类型时可以使用该类型。

关于Java泛型方法重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034165/

相关文章:

java - 将 List<?> 转换为 List<ObjectType> 的最快方法

Java泛型错误?

css - 如何覆盖最小宽度

c# - 使用 Mono 的泛型类型参数没有装箱或类型参数转换

c# - 如何覆盖 [] 数组中的 ToString()?

C# 类 Java 类的内联扩展?

java - 如何让 Barcode4J FOP 扩展在 OSGi 中工作(用于使用条形码生成 PDF)

java - 运行在 Redhat 上的配置文件 Tomcat 实例

java - Gradle构建没有类的jar

java - 如何在亚马逊服务器中部署 Web 应用程序