- ベストアンサー
総称型のキャストでエラー
下の書き方で、※1はエラーにならないのですが ※2ではエラーになります。 ※1がキャスト可能であれば、 ※2も可能だとおもうのですが。 Java7を使っています。 public class Soushou { void test() { List<Kodomo> kodomoList = new ArrayList<Kodomo>(); List<? extends Oya> oyaList = kodomoList; Object o1 = (List<Oya>) oyaList; // ※1 エラーにならない。 Object o2 = (List<Oya>) kodomoList; // ※2 「キャストすることができません」エラーになってしまう。 } } class Oya { // 親クラス } class Kodomo extends Oya { // 親クラスを継承した子クラス }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
List<Kodomo>はKodomoの派生でないクラスのインスタンスは要素とできません。 List<Oya>はOyaクラスの派生の任意のインスタンスを要素とできる型です。 よってList<Kodomo>型をList<Oya>型として扱うこと許すとKodomo以外を要素にしない意図で定義したList<Kodomo>の制約に違反することとみなしエラーとなります。 一方、List<? extends Oya>型というのは要素の型がOyaクラスの派生の「ある特定のクラス」であるようなList(の集合)です。この型にはList<Oya>もList<Kodomo>もその他Oyaの派生の任意のクラスを要素型とするListを包含しています。 この場合、キャストしようとしている右辺の値がList<Kodomo>なら正しくない型変換ですが、右辺の値がList<Oya>ならば正しい変換が行えます。キャストというのは実行時に正しい変換ができる可能性があるならばコンパイル時にはエラーになりません。 補足:しかしパラメータ付きの型は実行時にパラメータの部分の型の情報が消失してしまうので実行時に妥当でないキャストをしてもClassCastExceptionをVMがスローしてくれないことがあります。ご注意を。