読者です 読者をやめる 読者になる 読者になる

Effective Javaを読んでいる㉓

Java

総称型のクラスを型パラメータなしで使うな

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はListのサブタイプとなる。

何がはいってくるかわかんない場合はunbounded wildcard type(非境界ワイルドカード型)

例外

       Class clazz = List.class;//これはできるが
        Class clazz2 = List<String>.class;//これはできない

<<<instanceofが使えない>>>
rawでinstanceofして非境界ワイルドカード型にすぐキャストするのがよい

<<<<<実行時にジェネリクスの情報は消えるからこんなんなる>>>>>

非境界ワイルドカード型についてはこれをみました
Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して