Javaにおける汎用性の概要

2446 ワード

1、汎用型発生の原因:まず、ここで説明するのはJDK 1である.5+になってから追加しました.その前に、コンテナにコンテンツを追加しようとするたびに、手動で追加したタイプのエラー(たとえばStringを入力したいのにintを誤って負けた)が発生すると、汎用型はここで入力したデータ型を規範化することができます.
HashSet hs = new HashSet();

上記の例のように汎用型を使用する場合、入力したデータ型と汎用型の規定が異なると、コンパイル期間中にエラーが表示されます.2、汎用概念:汎用はパラメトリックタイプの概念を実現し、コードが多種のタイプに応用できるようにした.では、パラメトリックタイプとは何でしょうか.
Stack

スタック(コンテナ)を上のように定義する場合、Stackに格納されているデータ型を表す特殊な意味のないアルファベットTを使用します.このような利点は、このクラスをインスタンス化するときに<>で直接データ型を定義できることです.(<>ここではデータ型のパッケージ類しか定義できません)汎用型を使用する利点です.(1)タイプセキュリティ:汎用型を使用すると、Stringタイプの値しか入力できないなど、入力タイプを指定できます.他の値を入力するとエラーが発生します.これはコード作成時に便利です.(2)強制タイプ変換を排除します.つまり、タイプ変換を行う必要がなく、直接保存し、直接出力します.(3)コンパイル期間のみ有効:すなわち、実行期間中の汎用型は無効である.これにより、jvmが実行時に時間を費やして追加の操作を行うことが回避される.(1)(2)やはり理解しやすい.(3)ここでは反射機構を用いて第3点を検証する
public class Demo {
    public static void main(String[] args) throws Exception {
        //   list1              
         ArrayList list1=new ArrayList();
        //   list2         :    int  
        ArrayList list2=new ArrayList();
        //  ,  Class
        Class c1=list1.getClass();
        Class c2=list2.getClass();
        //    ,     
        System.out.print(c1==c2);//true
    }
}

上記のコードの例から、実行中に汎用型が機能しなくなったことがわかります.汎型を定義したlistと定義していないlistの比較は等しい.
注意:1、汎用クラスにはinstanceofは使用できません.汎用クラスはコンパイル期間のみ有効なので、実行期間ではどのタイプなのか区別されません.次のエラーが発生します.
Cannot perform instanceof check against parameterized type Box. 
Use the form Box> instead since further 
generic type information will be erased at runtime

2、汎用インタフェースを継承する場合は、具体的にどのようなタイプなのかを指定する必要があります3、汎用での方法も、対応する汎用パラメータに具体的なタイプを与える必要があります.4、静的方法で汎用パラメータを使用する場合、静的方法を汎用方法として定義する必要がある
汎用型の消去メカニズム:前述したように、汎用型はコンパイル期間にのみ有効であり、実行期間に仮想マシンでは見分けられず、反射コードで検証しました.では、コンパイル期間から汎用型を識別することができ、実行期間まで汎用型を識別できないには必ずプロセスが必要であり、このプロセスでコンパイラは必ず汎用型を処理しなければ、実行期間にならない.この処理はタイプ消去です.
public class demo{
public void func1(List  list){  }
public void func1(List  list){  }
}

上記のコードを定義すると、コンパイル時にエラーを報告しません.汎用型の消去メカニズムはコンパイル期間中にすでに行われているため,ここでは上記の2つのfunc 1メソッドに相当するのはメソッドの重荷ではない.ここではまた,汎用型消去の上下境界についても言及する.上界消去(設定なしでObjectにデフォルト消去)はextendsキーを使用します.下界消去はsuperキーを使用します.一般的に上界を使用することが多いです.汎用型は文法糖で、文法糖はプログラマーに便利な機能で、言語には何の影響もありません.本当に汎用型のメカニズムを身につけるには、自分でコードを工夫する必要があります.