首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java泛型方法重写

Java泛型方法重写
EN

Stack Overflow用户
提问于 2014-06-04 09:48:42
回答 2查看 167关注 0票数 1
代码语言:javascript
复制
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的抹去

代码语言:javascript
复制
dosome(Class<Number> c)?

如果是这样的话,那又有什么问题呢?

EDIT1:,或者如果我切换泛型类型:

代码语言:javascript
复制
abstract class A {
    abstract public void dosome(Class<Number> c);
}

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

这个案子怎么了?

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

EN

回答 2

Stack Overflow用户

发布于 2014-06-04 09:53:33

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

代码语言:javascript
复制
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的特殊含义,它描述了具有给定“上限”的“未知”类型,当您不关心或无法获得具体类型时,就可以使用它。

票数 1
EN

Stack Overflow用户

发布于 2014-06-04 10:38:36

方法dosomeabstract类中,调用方可以选择调用任何类型的class,只要它是Number的一些类型。

代码语言:javascript
复制
abstract public void dosome(Class<? extends Number> c);

但是,您重写的方法如下

代码语言:javascript
复制
public void dosome(Class<Number> c) {}

这将阻止用户调用任何类型的Number,这意味着您不能使用integer类型进行调用。

根据重写规则,您不能更改method参数。所以,

Class<? extends Number>Class<Number>是不一样的,它的两种不同类型的参数,这就是为什么它是编译器错误的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24034165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档