繁体   English   中英

Java 覆盖泛型方法

[英]Java Overriding Generic Methods

这是怎么编译的:

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 不是抽象的,不会覆盖 Test 中的抽象方法 getValue(Integer)

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

擦除不能确保 T 被 Integer 替换吗? 那么为什么第二个例子无效呢?

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

类也是如此; 你可以写

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

但不是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM