我认为这会因为协变返回类型而起作用吗?

时间:2013-09-17 15:50:38

标签: java covariance

班级Main有一个子类SubMain

班级Foo有一个子类SubFoo

Main

public List<Foo> getFoo() { return null; }

SubMain

@Override
public List<SubFoo> getFoo() { return this.subfoo; }

我在List<SubFoo>上遇到了编译错误。我错误地想到了这个吗?以下几个消息来源让我觉得这样可行。

http://en.wikipedia.org/wiki/Covariant_return_type

https://stackoverflow.com/a/10134596/1747491

2 个答案:

答案 0 :(得分:5)

考虑一下:

public List<? extends Foo> getFoo() { return null; }

正如Edwin所述,List<SubFoo>不是List<Foo>的子类,因为您无法将Foo添加到List<SubFoo>

其他选择:

public class Main<T extends Foo>{
   public List<T> getFoo();
}

public class SubMain extends Main<SubFoo>{
  public List<SubFoo> getFoo();
}

或让SubMain返回List<Foo>

答案 1 :(得分:1)

List<SubFoo>不是List<Foo>的子类型,但ArrayList<Foo>List<Foo>的子类型。

请参阅Generics link

解:

您可以执行List<? extends Foo> getFoo()

之类的操作

有关更多信息,请参阅Wildcards and Subtyping link