5

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

现在我有一个List<Son>,我需要将它转换为一个List<Father>.

我能怎么做?

编辑

对不起命名不好,我没有解释自己。PersonEmployee会是一个更好的例子。或者ProductComputer也是。

4

4 回答 4

3

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

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

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

于 2013-02-27T12:19:11.917 回答
3

假设您可以通过强制转换来做到这一点,这将导致以下问题:

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

两者ls和都lf指向同一个实例,因此您刚刚将一个Father对象添加到 Sons 列表中。

于 2013-02-27T12:19:29.073 回答
3

2条建议:

有一个接口,比如说PersonFather(因此Son)实现。两者都用List<Person>

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

于 2013-02-27T12:21:22.510 回答
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);
}
于 2013-02-27T12:20:18.733 回答