LoginSignup
35
31

More than 5 years have passed since last update.

List<Object>とList<?>の違い

Last updated at Posted at 2014-10-09

はじめに

JavaのList<Object>とList<?>のふるまいの違いを簡単に解説する。

代入できる値

List<?>型の変数には、すべてのList型の値を入れることができる。<>の中の型はなんでもよい。
List<Object>型の変数には、List<Object>型の値のみ入れることができる:

List<?> list1;
List<Object> list2;

list1 = new ArrayList<Object>();
list2 = new ArrayList<Object>();

list1 = new ArrayList<Integer>();
list2 = new ArrayList<Integer>(); //コンパイルエラー

add()

List<?>には、nullしかaddできない。
List<Object>には、Object型を継承した値ならなんでもaddできる:

List<?> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();

list1.add(null);
list2.add(null);

list1.add(new Object()); //コンパイルエラー
list2.add(new Object());

list1.add(new Integer(1)); //コンパイルエラー
list2.add(new Integer(1));

get()

List<?>もList<Object>も、ともにObject型を返す:

List<?> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();

Object value1 = list1.get(0);
Object value2 = list2.get(0);

なぜこのような違いがあるのか

List<?>型の変数には、すべてのList型を入れられるのだから、すべての型をaddできてもよさそうに思える。
しかし、すべての型をaddできることにしてしまうと、型安全性が失われてしまう:

List<?> list1 = new ArrayList<Integer>();
list1.add(new String()); //Integer型のListにStringをaddできてしまった。

つまり、List<?>には、すべてのList型に対してaddできる値のみaddできるようにする必要がある。
この値はnullしかない。

35
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
31