Java 重写泛型抽象方法';s返回类型没有类型安全警告
在一些超类中,我有一个抽象的泛型方法:Java 重写泛型抽象方法';s返回类型没有类型安全警告,java,generics,abstract,Java,Generics,Abstract,在一些超类中,我有一个抽象的泛型方法: protected abstract <T extends Foo> T getFoo(); 其中public类子对象扩展了Foo 在我的子类的getFoo中,我得到了以下错误 “类型安全性:类型子类中getFoo()的返回类型subfo需要未经检查的转换,以符合类型超类中的T” 我的问题是: 1) 是否存在这样不安全的情况 2) 如果不是的话,编译器难道不能弄明白吗?是什么阻止编译器在编译时发现subfo是Foo的一个子类 3) 有没有办法
protected abstract <T extends Foo> T getFoo();
其中public类子对象扩展了Foo
在我的子类的getFoo
中,我得到了以下错误
“类型安全性:类型子类中getFoo()的返回类型subfo需要未经检查的转换,以符合类型超类中的T”
我的问题是:
1) 是否存在这样不安全的情况
2) 如果不是的话,编译器难道不能弄明白吗?是什么阻止编译器在编译时发现subfo是Foo的一个子类
3) 有没有办法做到这一点,但不需要警告?是的,这是不安全和非法的。您编写的
超类
声明允许调用方(而不是超类
子类)选择它想要的Foo
的子类型,因此您在子类
中的实现无法正确实现它
相反,您必须将
T
作为超类
本身的通用参数,而不仅仅是方法:超类
,然后子类扩展了本质上不安全的超类
。如果我用另一个类型参数调用你的方法怎么办?@Oren你这样做违反了Liskov替换原理。。。你的超类型不能被你的子类型所取代。你不知道非法(它编译了,还没有人来逮捕我:),但我现在明白了这是多么不安全。谢谢你的快速回复,你的回答解决了我的问题。
@Override
protected SubFoo getFoo() {
return new SubFoo();
}