「StringクラスはObjectクラスのサブクラスである。よってArrayList<String>はArrayList<Object>のサブクラスではないか」と考え、次のようなプログラムを作成しました。
ArrayList<Object> lo = new ArrayList<Object>();
ArrayList<String> ls = new ArrayList<String>();
lo = ls;
しかし、型エラーとなりコンパイルを通すことが出来ませんでした。これはいったい何故でしょうか?
説明が難しいのですが、(ちょっと修正)
言語上の機能の違いの話で、
総称型(ジェネリクス)クラスは、
普通のクラスとは違う目的を持った機能であり、
ArrayList<Object>, ArrayList<String>
とすることで、通常のクラス表現
Object, String
の「ベースクラス-サブクラス関係」にもたらされる
「代入の親和性」が、それだけで連動して生まれてはならないのです。
なぜなら、
総称型(ジェネリクス)クラス<型指定表現>は、その意味として、
といった役目・機能目的があるからです。
一見普通のクラスと同様に書けば同じ親和効果が得られるように見えるのですが、
<>の中と外では意味が違ってきていっしょくたにすることができません。
単純に ArrayList<Object> は Object 型しか受け付けませんので
String を許容するようにしたかったら ArrayList<? extends Object>
というように Object を継承している型を受け付けるということを
明記してあげなければなりません。
コメント(1件)
ArrayList<String> ls = new ArrayList<String>();
lo = ls;
ならコンパイルエラーを出ないはずです。