「Father」という名前の単純な POJO と、最も単純なクラス継承の例である「Father」を拡張する「Son」という名前の別の POJO があります。
これで があり、List<Son>
それを にキャストする必要がありList<Father>
ます。
どのようにできるのか?
編集
悪いネーミングで申し訳ありません、私は自分自身を説明していませんでした. PersonとEmployeeはより良い例です。またはProductとComputerも。
「Father」という名前の単純な POJO と、最も単純なクラス継承の例である「Father」を拡張する「Son」という名前の別の POJO があります。
これで があり、List<Son>
それを にキャストする必要がありList<Father>
ます。
どのようにできるのか?
編集
悪いネーミングで申し訳ありません、私は自分自身を説明していませんでした. PersonとEmployeeはより良い例です。またはProductとComputerも。
上記のコメントのように、ここでキャストを使用することはできません*。変換(つまりコピー)を行うための小さなヘルパーメソッドを書くことができます:
private static List<Father> getListFather(List<? extends Father> list) {
return new ArrayList<> (list);
}
*実際にはできます-他の答えを参照してください:List<Father> listFather = (List<Father>) (List<? extends Father>) listSons;
2 つの提案:
を実装Person
するFather
(したがって ) などのインターフェイスを用意します。Son
両方に使用List<Person>
します。
new List<Father>
コレクション コンストラクターを使用して を作成します。List<Father> fathers = new ArrayList<Father>(sons);
少しの間、キャストでそれを行うことができると仮定すると、次の問題が発生します。
List<Son> ls = ...;
List<Father> lf = (List<Son>) ls;
lf.add(new Father());
と の両方が同じインスタンスls
をlf
指しているので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);
}