総称型のクラスを型パラメータなしで使うな
List list = new BookList; list.add(new Magazine()); Book book = (Book)list.get(0);
コンパイル通っちゃうけど実行時にキャストできなくてエラーになる。
ListとList¥<Object¥>の違い(なんか型パラメータの部分がマークダウンに引っかかって表示が狂うので¥つけてる エスケープされない理由は謎)
List
総称型のチェックをしない
List¥<Object¥>
総称型のチェックをする
public static void main(String[] args) throws IOException{ List rawList = new ArrayList(); List<Object> objectList = new ArrayList<>(); List<String> stringList = new ArrayList<>(); rawList = stringList;//コンパイルが通る objectList = stringList;//コンパイルが通らない(List<String>はList<Object>のサブタイプではない) }
総称型のルールにおいて、List
何がはいってくるかわかんない場合はunbounded wildcard type(非境界ワイルドカード型)
例外
Class clazz = List.class;//これはできるが Class clazz2 = List<String>.class;//これはできない
<<<instanceofが使えない>>>
rawでinstanceofして非境界ワイルドカード型にすぐキャストするのがよい
<<<<<実行時にジェネリクスの情報は消えるからこんなんなる>>>>>
非境界ワイルドカード型についてはこれをみました
Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して