Java ジェネリック: リストをキャストできません リストへ ? [重複] 質問する

Java ジェネリック: リストをキャストできません リストへ ? [重複] 質問する

この問題に遭遇しました:

List<DataNode> a1 = new ArrayList<DataNode>();
List<Tree> b1 = a1;  // compile error: incompatible type

ここで、DataNode 型は Tree のサブタイプです。

public class DataNode implements Tree

驚いたことに、これは配列でも機能します:

DataNode[] a2 = new DataNode[0];
Tree[] b2 = a2;   // this is okay

ちょっと変ですね。誰か説明してくれませんか?

ベストアンサー1

2番目のケースで見られるのは配列共分散これは、配列内の割り当てを安全でなくしてしまうので、私の意見では悪いことです。コンパイル時には問題なくても、実行時には失敗する可能性があります。

最初のケースでは、コードがしたコンパイルされ、次のように続きます。

b1.add(new SomeOtherTree());
DataNode node = a1.get(0);

何が起こると予想しますか?

あなたはこれを行うことができます:

List<DataNode> a1 = new ArrayList<DataNode>();
List<? extends Tree> b1 = a1;

... なぜなら、 からのみ取得できb1、 と互換性があることが保証されるからです。コンパイラは安全かどうかわからないため、 を正確にTree呼び出すことはできません。b1.add(...)

見てAngelika Langer の Java Generics FAQ のこのセクション詳細については。

おすすめ記事