【发布时间】:2013-02-26 17:56:04
【问题描述】:
在一些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) 有没有办法实现这样的目标,但没有警告?
【问题讨论】:
-
这本质上是不安全的。如果我用不同的类型参数调用你的方法怎么办?
-
@Oren 你这样做违反了里氏替换原则......你的超类型不能被你的子类型替换