覆盖通用抽象方法的返回类型,不带类型安全警告

时间:2013-02-26 17:56:04

标签: java generics abstract

在某些SuperClass中,我有一个抽象的通用方法:

protected abstract <T extends Foo> T getFoo();

在我的SubClass中,我尝试用以下方式覆盖它:

@Override
protected SubFoo getFoo() {             
    return new SubFoo();
}

其中public class SubFoo extends Foo

在我的子类getFoo中,我收到以下错误。

“类型安全:来自类型SubClass的getFoo()的返回类型SubFoo需要未经检查的转换以符合类型SuperClass中的T”

我的问题是:

1)是否存在不安全的情况?

2)如果没有,编译器是否应该能够解决这个问题?什么阻止编译器在编译时弄清楚SubFoo是Foo的子类?

3)有没有办法实现这样的目标,但是没有警告?

1 个答案:

答案 0 :(得分:9)

是的,这是不安全和非法的。您编写的SuperClass声明允许调用者 - 而不是SuperClass子类 - 选择它所需的Foo子类型,因此您在SubClass未正确实施。

相反,您必须T作为SuperClass本身的通用参数,而不仅仅是方法:SuperClass<T extends Foo>,然后是SubClass extends SuperClass<SubFoo>