【问题标题】:Java Overriding Generic MethodsJava 覆盖泛型方法
【发布时间】:2020-07-25 00:33:07
【问题描述】:

这是怎么编译的:

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(Integer)

错误:名称冲突:Impl 中的 getValue(T) 和 Test 中的 getValue(Integer) 具有相同的擦除,但都不会覆盖另一个

不删除确保 T 被替换为整数吗? 那么为什么第二个例子无效呢?

【问题讨论】:

    标签: java generics overriding


    【解决方案1】:

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

    类也是如此;你可以写

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

    但不是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2014-05-23
      相关资源
      最近更新 更多