我有一个名为“Father”的简单 POJO 和另一个名为“Son”的 POJO,它扩展了“Father”,这是最简单的类继承示例。
现在我有一个List<Son>
,我需要将它转换为一个List<Father>
.
我能怎么做?
编辑
对不起命名不好,我没有解释自己。Person和Employee会是一个更好的例子。或者Product和Computer也是。
我有一个名为“Father”的简单 POJO 和另一个名为“Son”的 POJO,它扩展了“Father”,这是最简单的类继承示例。
现在我有一个List<Son>
,我需要将它转换为一个List<Father>
.
我能怎么做?
编辑
对不起命名不好,我没有解释自己。Person和Employee会是一个更好的例子。或者Product和Computer也是。
如上所述,您不能在此处使用演员表*。您可以编写一个小的辅助方法来进行转换(即复制):
private static List<Father> getListFather(List<? extends Father> list) {
return new ArrayList<> (list);
}
*实际上你可以 - cf另一个答案:List<Father> listFather = (List<Father>) (List<? extends Father>) listSons;
假设您可以通过强制转换来做到这一点,这将导致以下问题:
List<Son> ls = ...;
List<Father> lf = (List<Son>) ls;
lf.add(new Father());
两者ls
和都lf
指向同一个实例,因此您刚刚将一个Father
对象添加到 Sons 列表中。
2条建议:
有一个接口,比如说Person
,Father
(因此Son
)实现。两者都用List<Person>
。
使用集合构造函数创建一个new List<Father>
,例如List<Father> fathers = new ArrayList<Father>(sons);
这似乎有效:
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);
}