JAVA-汎用


JAVA汎用
1.概要
汎用:パラメトリックタイプです.メソッド内の変数パラメータと同様に、タイプを元の特定のタイプからパラメータ化します.この場合、タイプはパラメータ形式として定義され、呼び出し/実行時にのみ特定のタイプが入力されます.
汎用型の本質:パラメータ化タイプ、すなわち、新しいタイプを作成しない場合に、作成された異なるタイプを反省することによって、パラメータの具体的な制限のタイプを制御するため、すなわち汎用型を使用する過程で、操作のデータ型があるパラメータに指定された場合、タイプ変更は汎用クラス、汎用インタフェース、汎用メソッドで使用することができる.
2.特性
汎用型はコンパイル時のみ有効--->JVMの汎用型消去のためです.
    List l1 = new ArrayList();
    List l2 = new ArrayList();

    /*     true*/
    System.out.println(l1.getClass() == l2.getClass());

コンパイル中に汎用タイプの正確性を検証した後、関連情報を消去します.すなわち,汎用型はコンパイル段階で複数の異なるタイプに見えるが,実際にはコンパイル後の段階では同じ基本型である.
3.汎用的な使用
  • 汎用クラス
  • 汎用インタフェース
  • 汎用方法
  • 3.1汎用クラス
    汎用型により、クラスのセットに対する操作を対外的に同じインタフェースに開放することができ、典型的には、リスト、Set、Mapなど、様々なコンテナクラスがある.
    汎用クラスの基本的な書き方:
        class    {
          /*  T(    )     */
          private           ;
    
          /**
          *@param    
          *@return             
          */
          public           (@param T t){}
        }

    注汎用型標識:T、E、K、Vなどの一般的な標識として書くことができます.汎用クラスをインスタンス化する場合は、int、doubleなどの単純なタイプを使用できないTの特定のタイプ(カスタムクラスを含む)を作成する必要があります.
    3.2汎用インタフェース
    汎用インタフェースは、様々なクラスの生産器でよく使用されます.
    汎用インタフェースの基本的な書き方:
        public interface    {
          public T    ();
        }
    
        /**
         *        ,         ,       ,              
         *    ,     :"Unknown class"
         */
        class ImplGenerator implements Generator{
          @override
          public T next(){
            return null;  
          }
        }

    3.3汎用ワイルドカード
    次のようになります.
        public void showKetValue(Geberic> obj){
                    Log.d("    ","key value is " + obj.getKey());
        }

    注意:タイプワイルドカードは一般的に使用されますか?特定のタイプの実パラメータの代わりに.Integer、Stringと同じように実際のタイプです.
    シーンの使用:特定のタイプが不確定な場合、このワイルドカードは?操作タイプの場合、タイプの具体的な機能を使用する必要がない場合は、Objectクラスの機能を使用するだけで、使用できますか?未知のタイプを表すワイルドカードです.
    3.4汎用方法
    多くの汎用クラスのメンバーメソッドも汎用を用いており,汎用クラスには汎用メソッドが含まれているものもあり,学習時には区別に注意しなければならない.
    汎用クラス:クラスをインスタンス化するときに汎用の具体的なタイプを指定します.汎用メソッド:メソッドを呼び出すときに汎用の具体的なタイプを指定します.汎用メソッドは、任意の場所や任意のシーンで使用できます.
    一般的な方法の基本的な書き方:
        /**
         *@param t       
         *@return T      T
         *  :
         *1)     public              
         *2)               T,  T、E、K , T            
         *3)Class  T          
         *4)             
         * :
         *public  K showKeyName(Generic container){...}
         */    
         public  genericMethod(Class t) throws InstantiationException,
          IllegalAccessExceotion{
            T instance = t.newInstance();
            return instance;
          }

    3.4.1汎用メソッドと可変関数
    次のようになります.
        public  void printMsg(T...args){
          for(T t:args){
            Log.d("Test"," t is " + t);
          }
        }

    3.4.2静的方法と汎用性
    クラス内の静的メソッドは汎用型を使用します.静的メソッドはクラスで定義された汎用型にアクセスできません.メソッド操作の参照データ型が不確定な場合は、汎用型を静的メソッドに定義する必要があります.
    次のようになります.
        public class StaticGenerator {
        ....
        /**
         *                ,           (            )
         *                         。
         * :public static void show(T t){..},            :
              "StaticGenerator cannot be refrenced from static context"
         */
        public static  void show(T t){}
        }

    3.4.3汎用方法のまとめ
    汎用メソッドはクラスから独立して変化することができ、基本原則は以下の通りである.
    いつでもできるなら、できるだけ汎用的な方法を使います.つまり、汎用的な方法でクラス全体を汎用化すれば、汎用的な方法を使うべきです.また、staticのメソッドでは、汎用タイプのパラメータにアクセスできません.したがってstaticメソッドで汎用能力を使用するには,汎用メソッドにしなければならない.
    4.汎用的な上下境界
  • 上の境界を追加します.すなわち、入力タイプの実パラメータは、指定パラメータまたはそのサブタイプ
    public void showKeyValue(Generic extends Number> obj){}
  • である必要があります.
  • 境界を追加します.すなわち、入力タイプの実パラメータは、パラメータまたはその親
    public void showKeyValue(Generic super Integer> obj){}
  • である必要があります.
  • 境界なし、すなわちワイルドカード?参照「3.3汎用ワイルドカード」
  • 例:
        //                 ,                     ,           
        //public  T showKeyName(Generic container),      :"Unexpected bound"
        public  T showKeyName(Generic container){
          System.out.println("container key :" + container.getKey());
          T test = container.getKey();
          return test;
        }

    注意:汎用の上下境界を追加するには、汎用の宣言と一緒にする必要があります.