Javaタイプ消去

7836 ワード

消去タイプ
Javaはコンパイル後のバイトコード(.class)ファイルには汎用中のタイプ情報が含まれていません.汎用を使用するときに付けられたタイプパラメータは、コンパイラがコンパイル時に削除されます.このプロセスをタイプ消去と呼びます.コードに定義されているList Listなどのタイプはコンパイル もリストとなり、JVMが ているのはリストのみであり、 に されたタイプ はJVMには えない.したがって、JVMにとってList Listは じクラスであるため、 は にはJava の であり、 とも ばれる.
タイプ によるプロパティ
1. クラスには のクラスオブジェクトはありません. えば、List.classまたはList.classは せず、List.classのみであり、 えば、 のコード はtrueである.
public static void main(String[] args) {  
    List<String> a = new ArrayList<String>();  
    List<Integer> b = new ArrayList<Integer>();  
    System.out.println(a.getClass() == b.getClass());  
}

2. は、 クラスのすべてのインスタンスによって されます.MyClassとして されたクラスについて、 にアクセスする は としてMyClass.StaticVarである.new MyClassによって されたオブジェクトも、new MyClassによって されたオブジェクトも、 を します.3. タイプパラメータはJava のcatch では できません. はJVMの に われるためである.タイプ が されるため、JVMは2つの タイプMyExceptionMyExceptionを することができない.JVMの は、MyExceptionタイプであり、 に するcatch を することはできません.
タイプ の
タイプ の も です.まず、タイプパラメータを き えるための のクラスを つけます.この なクラスは にObjectである.タイプパラメータの が されている は、この が されます.コードのタイプパラメータを のクラスに き えます. に されるタイプ を します.すなわち、<>の を します. えば、T get()メソッド はObject get()Listになり、Listになります. に、ブリッジメソッドを する がある があります.(bridge method).これは、タイプを した のクラスに な が けている があるためである. えば、 のコードを すると、タイプ が された 、 のクラスの はClass MyString implements Comparableになった.しかし、これにより、インタフェースMyStringで されたComparableの が されないため、クラスint compareTo(Object)にコンパイルエラーが する.この 、コンパイルによってこのメソッドを に します.
class MyString implements Comparable<String> {
    public int compareTo(String str) {        
        return 0;    
    }
} 

インスタンス
タイプ メカニズムを すると、コンパイラはすべてのタイプチェックを していることがわかります.コンパイラが な を するのは、タイプのセキュリティを するためです. のList Listを に に します.
public void inspect(List<Object> list) {    
    for (Object obj : list) {        
        System.out.println(obj);    
    }    
    list.add(1); 
}
public void test() {    
    List<String> strs = new ArrayList<String>();    
    inspect(strs); //     
}

このコードでは、inspect()メソッド Listtest()メソッドでListに しようとすると、コンパイルエラーが します.このようなアプローチが されると すると、inspect()メソッドでは、list.add(1)によってセットに を することができる.このように、test()メソッドでは、Listと された にIntegerタイプのオブジェクトが されている.これは らかにタイプ の に しており、ある ClassCastExceptionを げ すに いない.したがって、コンパイラはこのような を します.コンパイラは、 な りタイプのセキュリティの をチェックします. する に していると した 、コンパイルエラーが します.コンパイラがタイプの が しいかどうかを できない 、 メッセージが されます.