Java泛型方法覆盖

时间:2014-06-04 09:48:42

标签: java generics override

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规则,这种情况有什么问题。

2 个答案:

答案 0 :(得分:1)

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

的内容
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描述&#34;未知&#34;的特殊含义。用给定的&#34;上限键入#34;可以在您不关心或无法获得具体类型时使用。

答案 1 :(得分:1)

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>不一样,它有两种不同类型的参数,这就是编译错误的原因。