5

「Father」という名前の単純な POJO と、最も単純なクラス継承の例である「Father」を拡張する「Son」という名前の別の POJO があります。

これで があり、List<Son>それを にキャストする必要がありList<Father>ます。

どのようにできるのか?

編集

悪いネーミングで申し訳ありません、私は自分自身を説明していませんでした. PersonEmployeeはより良い例です。またはProductComputerも。

4

4 に答える 4

3

上記のコメントのように、ここでキャストを使用することはできません*。変換(つまりコピー)を行うための小さなヘルパーメソッドを書くことができます:

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

*実際にはできます-他の答えを参照してください:List<Father> listFather = (List<Father>) (List<? extends Father>) listSons;

于 2013-02-27T12:19:11.917 に答える
3

2 つの提案:

を実装PersonするFather(したがって ) などのインターフェイスを用意します。Son両方に使用List<Person>します。

new List<Father>コレクション コンストラクターを使用して を作成します。List<Father> fathers = new ArrayList<Father>(sons);

于 2013-02-27T12:21:22.510 に答える
3

少しの間、キャストでそれを行うことができると仮定すると、次の問題が発生します。

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

と の両方が同じインスタンスlslf指しているのでFather、Sons のリストにオブジェクトを追加しただけです。

于 2013-02-27T12:19:29.073 に答える
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 に答える