2012-04-16 15 views
2

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

誰でも、これらの2つの亜種の違いと、なぜ2番目のものが機能しないのか説明できますか?

+3

正確な複製:http://stackoverflow.com/questions/8093767/generics-cast-issue – jalopaba

+0

http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html –

答えて

1

これについては、Genericsの概念をもう少し理解する必要があります。次のコードで

見てみましょう:あなたは、コレクションにはYを拡張するオブジェクトが含まれていることを意味し、あなたのList<X>Collection<? extends Y>にキャストする必要がありますが、あなたは正確な型を知らない理由

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)にキャストすることができますが、コレクション内の実際のタイプがわからないため、add()やaddAll()などの操作は許可されません。

関連する問題