在某些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)有没有办法实现这样的目标,但是没有警告?
答案 0 :(得分:9)
是的,这是不安全和非法的。您编写的SuperClass
声明允许调用者 - 而不是SuperClass
子类 - 选择它所需的Foo
子类型,因此您在SubClass
未正确实施。
相反,您必须T
作为SuperClass
本身的通用参数,而不仅仅是方法:SuperClass<T extends Foo>
,然后是SubClass extends SuperClass<SubFoo>
。