【问题标题】:Overriding generic abstract method's return type without type safety warnings在没有类型安全警告的情况下覆盖泛型抽象方法的返回类型
【发布时间】: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 你这样做违反了里氏替换原则......你的超类型不能被你的子类型替换

标签: java generics abstract


【解决方案1】:

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

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

【讨论】:

  • 不知道非法(它编译并且没有人来逮捕我:))但我现在知道这是多么不安全。感谢您的快速回复,您的回答解决了我的问题。
猜你喜欢
  • 2012-03-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多