当前位置: 首页 > 知识库问答 >
问题:

Java重写泛型方法

广亮
2023-03-14

这是如何编译的:

interface Test {
    <T extends Integer> T getValue(T n);
}

class Impl implements Test{
    public Integer getValue(Integer n) {
        return n;
    }
}

但这并不是:

interface Test {
    Integer getValue(Integer n);
}

class Impl implements Test{
    public <T extends Integer> T getValue(T n){
        return n;
    }
}

它给我以下编译错误:

Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数)

错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个

擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?

共有1个答案

空正豪
2023-03-14

您可以使用非泛型方法重写泛型方法,其签名是对泛型方法的擦除,但不是相反。这有一个很好的理由——允许超类型迁移到泛型,而不强制所有子类在同一天迁移。因此,编译器可以容忍被擦除的覆盖。但是,在另一个方向上,您试图用泛型方法覆盖非泛型方法,并且没有合理的迁移场景可以产生这种情况——这只是一个错误。

班级也是如此;你可以写

class Foo<T> { }
class Bar extends Foo { }

但不是

class Foo { }
class Bar extends Foo<T> { }
 类似资料:
  • 我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。 基本泛型类: 儿童班: 实施: 我想在其中覆盖参数化方法的子视图类: 这是Eclipse抛出错误消息的地方: 注意类和接口:事件和级别: 以及继承自 的 Model 类 我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdap

  • 来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。 方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。 是对一个 如果是这样,什么是错的? EDIT1:或者如果我切换通用类型: 这种情况下有什么问题? EDIT2:我知道如何修复它,但我想了解,在这

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代

  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • Main.java:12:错误:TextMessage不是抽象的,并且不会覆盖Message类中的抽象方法setContent(T)TextMessage扩展Message{^其中T是类型变量:T扩展方法setContent(T)中声明的Object 1错误

  • 问题内容: 我有一个抽象类 Monitor.java ,它由类 EmailMonitor.java 子类 化 。 方法: 在 Monitor.java中 定义,并且必须在 EmailMonitor.java中 覆盖。 我目前在 EmailMonitor.java中 重写了如下方法: 但是,这会产生编译时错误: 是的子类,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,