韓順平java第25講、第26講汎用型

4084 ワード

汎用型
  • 汎用の本質はパラメトリックタイプであり、すなわち、動作するデータ型は、クラス、インタフェース、およびメソッドの作成に使用でき、それぞれ汎用クラス、汎用インタフェース、汎用メソッドと呼ばれるパラメータとして指定される.
  • 汎用型がない場合、タイプObjectへの参照によってパラメータの「任意化」が実現され、「任意化」がもたらす欠点は、表示される強制タイプ変換を行うことであるが、この変換は、開発者が実際のパラメータタイプを予知可能な場合に実行することを要求するものであり、強制タイプ変換エラーの場合、コンパイラはエラーを提示しない可能性がある.運転中に異常が発生するのは、セキュリティ上の危険です.
  • 汎用型の利点は、コンパイル時にタイプセキュリティをチェックし、すべての強制変換が自動的かつ暗黙的であり、コードの再利用率を向上させることである.例えば:
  • ArrayList al = new ArrayList();
    Dog d = new Dog();
    al.add(d);
    Dog temp = (Dog)a.get(0);//!!!          !      !!       ,    !!
    //Cat temp = (Cat)a.get(0);//          ,        

    汎用型を使って解決!
    ArrayList al = new ArrayList();
    Dog d = new Dog();
    al.add(d);
    Dog temp = a.get(0);//      ,       

    汎用的な利点
  • 型セキュリティ
  • 後方互換
  • 階層明瞭
  • はパフォーマンスが高く、GJ(汎用java)で作成されたコードはjavaコンパイラと仮想マシンにより多くのタイプの情報をもたらすことができ、これらの情報はjavaプログラムをさらに最適化するために条件を提供します.

  • JAvaの反射メカニズム
    つまり、あなたは今クラスを作成していますが、このクラス関数のパラメータやクラスのメンバー変数がどんなタイプなのか分かりません.このとき、複数を書くのは賢明ではありません.コードの再利用率を高めるために、私たちは汎用型を使っています.反射メカニズムによって伝達パラメータのタイプ情報が得られ,さらに処理され,1つのできることが多くなった.
    package sort;
    import java.lang.reflect.*;
    
    public class Sort {
    
        public static void main(String [] args){
            Gen gen1 = new Gen("   ");
            gen1.showTypeName();
            //           ,                ,         
            Gen gen2 = new Gen(3);
            gen2.showTypeName();
    
            Gen gen3 = new Gen(new Bird());
            gen3.showTypeName();
            gen3.showMethods();
        }
    }
    class Bird{
        public void cry(){
            System.out.println("    ");
        }
        public void count(){
            System.out.println("1 2 3 4 ");
        }
    }
    class Gen{
        T o;
        public Gen(T o){
            this.o = o;
        }
        public void showTypeName(){
            System.out.println("type is :" + o.getClass().getName());
        }
        public void showMethods(){
            //      ,      T         ,     ,   ,  
            Method []m = o.getClass().getDeclaredMethods();
            for(int i = 0;i < m.length;++i){
                System.out.println(m[i].getName());
            }
        }
    }

    ArrayListの理解
    このとき,このArrayListの後ろにある括弧の使い道はjavaにおける反射メカニズムを適用し,入力タイプのいくつかの情報を判断することであることが分かるので,ある値を得ると,反射情報から得られるものが自動的に変換され,手動変換が省けてしまう.そしてもっと安全になりました.