ArrayList<String> list = new ArrayList<String>(); list.add("a"); String s = list.get(0);
これは、コンパイルされて
ArrayList<Object> list = new ArrayList<Object>(); list.add("a"); String s = (String)list.get(0);
こうなる。ただこれだけの仕組み。Tに何が指定されてたかの情報は失われる。
だから new T() はTが何かに関わらず「常に」new Object() と同じなので意味がない。
T[] なんかも同様に Object[] になってしまう。
クソだろう? 互換性の都合。