3

在一些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)有没有办法实现这样的目标,但没有警告?

4

1 回答 1

9

是的,这是不安全和非法的。SuperClass您编写的声明允许调用者(而不是SuperClass子类)选择Foo它想要的子类型,因此您的实现SubClass不能正确实现它。

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

于 2013-02-26T17:57:50.797 回答