2

例で問題を説明しようとします。X という名前のインターフェースを取得し、X を実装するクラス Y を取得しました。Y のいくつかのインスタンスがリストに収集されます。ここで、私が本当に理解していない点があります。このリストをコレクションに割り当てようとすると、コンパイラ エラーが発生します。それ以外の場合、このリストをコレクションに割り当てると機能します。

List<Y> yList = new ArrayList<Y>();
// works
Collection<? extends X> coll1 = yList;
// error
Collection<X> coll2 = yList;

これら2つのバリアントの違いと、2番目のバリアントが機能しない理由を誰かが説明できますか.

4

1 に答える 1

1

このためには、ジェネリックの概念をもう少し理解する必要があります。

次のコードを見てみましょう。

List<Integer> ints = new ArrayList<Integer>();
ints.add(Integer.valueOf(1));
List<Number> numbers = ints;// This does not compile! and you will now see why:

numbers.add(new Double(2.3d));// This is valid
Integer i = ints.get(1); // This would be broken then because I expect an Integer but get a Double

これが、コレクションに Y を拡張するオブジェクトが含まれているが、正確な型がわからないという意味にキャストList<X>する必要がある理由です。Collection<? extends Y>(Y) にキャストできることはわかっていますが、コレクション内の実際の型がわからないため、add() や addAll() などの操作は許可されません。

于 2012-04-16T13:38:27.350 に答える