[英]Java generic method 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的签名是子签名(第8.4.2节) m2的签名。
如果满足以下任一条件,则方法m1的签名是方法m2签名的子签名:m1的签名与m2的签名的擦除(第4.6节)相同。
是擦除A
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规则,在这种情况下出了什么问题。
如果您希望能够根据每个参数类型都必须扩展的通用基本类型在子类中定义具体的参数类型,则必须编写类似
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
? extends Number
描述具有给定“上限”的“未知”类型的数字,当您不在乎或无法获得具体类型时,可以使用该数字。
该方法在abstract
类中dosome
,调用者可以选择调用任何类型的class
,只要它是Number
某种类型
abstract public void dosome(Class<? extends Number> c);
但是你覆盖了像
public void dosome(Class<Number> c) {}
这将阻止用户调用任何类型的Number
,这意味着您不能使用integer
类型进行调用。
根据覆盖规则,您无法更改method
参数。 所以,
Class<? extends Number>
Class<? extends Number>
和Class<Number>
是不相同的,它的两种不同类型的参数,这就是其编译器错误的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.