Javaの総称型についての質問です。

「StringクラスはObjectクラスのサブクラスである。よってArrayList<String>はArrayList<Object>のサブクラスではないか」と考え、次のようなプログラムを作成しました。

ArrayList<Object> lo = new ArrayList<Object>();
ArrayList<String> ls = new ArrayList<String>();
lo = ls;

しかし、型エラーとなりコンパイルを通すことが出来ませんでした。これはいったい何故でしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/18 16:40:03

回答2件)

id:jack_sonic No.1

回答回数124ベストアンサー獲得回数25

説明が難しいのですが、(ちょっと修正)

言語上の機能の違いの話で、

総称型(ジェネリクス)クラスは、

普通のクラスとは違う目的を持った機能であり、

ArrayList<Object>, ArrayList<String>

とすることで、通常のクラス表現

Object, String

の「ベースクラス-サブクラス関係」にもたらされる

「代入の親和性」が、それだけで連動して生まれてはならないのです。

なぜなら、

総称型(ジェネリクス)クラス<型指定表現>は、その意味として、

  • 「絶対にその型しか収容しないことを保証する」
  • 「それ以外の型を利用してしまう危険性をすべて排除する」
  • 「キャストの必要性をなくす」

といった役目・機能目的があるからです。

一見普通のクラスと同様に書けば同じ親和効果が得られるように見えるのですが、

<>の中と外では意味が違ってきていっしょくたにすることができません。

id:akagi_paon No.2

回答回数143ベストアンサー獲得回数13

単純に ArrayList<Object> は Object 型しか受け付けませんので

String を許容するようにしたかったら ArrayList<? extends Object>

というように Object を継承している型を受け付けるということを

明記してあげなければなりません。

  • id:akagi_paon
    ArrayList<? extends Object> lo = new ArrayList<Object>();
    ArrayList<String> ls = new ArrayList<String>();
    lo = ls;

    ならコンパイルエラーを出ないはずです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません