覆盖原始类型的通用方法

时间:2018-11-28 13:42:05

标签: java generics

我有带有通用方法的通用类

class Foo<T> {
    public <E> E execute() {
        return null;
    }
}

有人可以向我解释为什么:

class Bar extends Foo {
    public <E> E execute() {
        return null;
    }
}

产生错误

  Bar中的

execute()与Foo中的execute()冲突;两种方法都具有相同的擦除,但是都不能覆盖另一种方法

这没关系

class Bar extends Foo<Object> {
    public <E> E execute() {
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

在第一个示例中,您使用Foo的原始类型,因此Foo的方法签名为public Object execute()。这与Bar中的通用版本冲突。实际上,这很容易重现而无需继承,就像这样:

class Foo
{
    public <E> E execute() { return null; }
    public Object execute() { return null; }
}

在第二个示例中,您没有使用Foo的原始类型,因此execute方法的签名是完全匹配的。在这种情况下,这只是一个简单的方法覆盖。因此,您可能应该对其进行注释。

class Bar extends Foo<Object> {
    @Override
    public <E> E execute() {
        return null;
    }
}