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/