Cast List <son> to List <father> </father> </son>

时间:2013-02-27 12:10:28

标签: java list collections casting

我有一个名为“父亲”的简单POJO和另一个名为“Son”的人,它扩展了“父亲”,这是最简单的类继承示例。

现在我有List<Son>,我需要将其投放到List<Father>

我该怎么办?

修改

抱歉命名不好,我没有解释自己。 员工会是一个更好的例子。或者产品计算机

4 个答案:

答案 0 :(得分:3)

您不能在此处使用演员*,如上所述。您可以编写一个小帮助方法来进行转换(即副本):

private static List<Father> getListFather(List<? extends Father> list) {
    return new ArrayList<> (list);
}

*实际上你可以 - 参考另一个答案:List<Father> listFather = (List<Father>) (List<? extends Father>) listSons;

答案 1 :(得分:3)

假设你可以用演员表做一下,这会导致以下问题:

List<Son> ls = ...;
List<Father> lf = (List<Son>) ls;
lf.add(new Father());

lslf都指向同一个实例,因此您刚刚将一个Father对象添加到了Sons列表中。

答案 2 :(得分:3)

2条建议:

有一个接口,比如PersonFather(以及Son)实现。两者都使用List<Person>

使用集合构造函数创建new List<Father>,例如List<Father> fathers = new ArrayList<Father>(sons);

答案 3 :(得分:2)

这似乎有效:

static class Father {};
static class Son extends Father{};

public void test() {
  List<Son> sons = new ArrayList<>();
  // Not allowed.
  //List<Father> sons2 = (List<Father>)sons;
  // Two step.
  List<? extends Father> sons3 = sons;
  List<Father> sons4 = (List<Father>)sons3;
  // Direct.
  List<Father> sons5 = (List<Father>)((List<? extends Father>)sons);
}