この問題に遭遇しました:
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(...)