##はじめに
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型を返す:
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しかない。