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)?如果是这样的话,那又有什么问题呢?
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规则有什么问题。
发布于 2014-06-04 09:53:33
如果您希望能够根据每个参数类型必须扩展的公共基类型在子类中定义具体的参数类型,则必须编写以下内容
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的特殊含义,它描述了具有给定“上限”的“未知”类型,当您不关心或无法获得具体类型时,就可以使用它。
发布于 2014-06-04 10:38:36
方法dosome在abstract类中,调用方可以选择调用任何类型的class,只要它是Number的一些类型。
abstract public void dosome(Class<? extends Number> c);但是,您重写的方法如下
public void dosome(Class<Number> c) {}这将阻止用户调用任何类型的Number,这意味着您不能使用integer类型进行调用。
根据重写规则,您不能更改method参数。所以,
Class<? extends Number>和Class<Number>是不一样的,它的两种不同类型的参数,这就是为什么它是编译器错误的原因。
https://stackoverflow.com/questions/24034165
复制相似问题