Javaの汎用(Generic Type)


詳細
Javaの汎用(Generic Type)
一、背景知識
    オブジェクト向けプログラミングには、抽象、パッケージング、継承、マルチステートの4つの概念があります.
   
    この4つのプログラミング思想はJavaの中で体現されています.
   
    1、抽象:インターフェース、抽象クラス
    2、カプセル化:権限キーワードで自身の属性の対外アクセス/継承権限を制御する:public、protected、default、private
    3、継承:あるクラスは別のクラスの属性または方法を継承することができる.
    4、多態:継承があれば必ず多態がある.サブクラスの親の書き換え(overwrite)メソッドを許可します.
             マルチステートを実装する条件:継承、書き換え、アップグレード(親が子クラスを参照するオブジェクト)
[注1]).
   
   
注意:    ①親が子を参照するオブジェクトは、親で定義された属性またはメソッドのみを参照できます(クラスによって書き換えられている可能性があります).      サブクラスが独自に定義したプロパティとメソッドは参照できません.        ②サブクラスがサブクラスオブジェクトを参照する場合、サブクラスは親のメソッドを呼び出すことができます.   
二、「テンプレートと解釈器」思想
       
    Java言語は.classファイルをコンパイルして生成する必要があります.
    だから本当にメモリで実行されるコードはコンパイルされた.classファイルです.
   
    私たちが書いた.javaファイルは、実は解釈器がコンパイルするテンプレートです.
    では、テンプレートにさまざまな寸法を付けることができます.   
    Javaの注釈(annotation)はこのような「テンプレート」思想の典型的な応用である.
   
    コードをより柔軟にするために、Javaはmeta-dataを参照できる機能も提供しています.
    meta-dataとは?データを記述するデータです.
    Javaのこの方面の応用の体現は:反射(reflection)、汎用(Generic Type)です
    反射(reflection)を使用すると、newキーを使用してクラスにオブジェクトを生成することなくクラスを呼び出す方法があります.
    直接クラスをinvokeする方法ですこの考え方は「断面プログラミング向け」に応用できる.
    ソースコードを変更することなく、ソースコードの実行前後に新しい論理を追加できます.(例:ログモニタリング、権限判断)
   
   
三、汎型の起源
   
    JavaはJDK 1.5に汎用的な機能を追加した.
 
    『Javaプログラミング思想(第4版)』の記述によると、汎用的な出現の動機は以下の通りである.
   
        汎用型が最も注目されるのは、コンテナクラスを作成するためです.
       
    私たちはよくこのような書き方を見ます.
   
    ArrayList list = new ArrayList();
   
    上記の書き方は、Stringタイプのlistであることをコンパイラに伝えます.
    Stringタイプのデータしかロードできません.別のタイプのデータをロードするとエラーが表示されます.
   
四、汎用型の定義
    クラスのタイプのパラメータ化は、汎用です.
    あるいは、
    クラスのタイプは、パラメータ変数としてクラスまたはクラスに渡す方法としても使用できます.
   
    何?また1つのパラメータ形式が追加されましたか?はい.
   
    Javaのメソッド(method)がカッコを使用してパラメータを宣言することを知っています.   
    Javaは括弧<>を使用して汎用型を宣言します.
   
   
五、汎用的な意味
   
    異なるクラスはその汎用型が表す意味が異なる.
    クラスの実現方法に基づいて,汎用型が表す具体的な意味を見る.
   
六、汎用型の実現方法
   
1、汎用型の定義
    Javaは
クラスまたは
クラスのメソッドの宣言では、汎用性が宣言されます.複数のパラメータをカンマで区切ります.
    汎用宣言は、クラス名の後またはメソッドの戻り値の前に書く必要があります.
   
   
    クラス名の後に書かれた汎用宣言:

    public class Student{
        
    }

   
    メソッドの戻り値の前に、汎用宣言を書きます.

    public static  void update (K k, V v){
        
    }

   
    ここで説明します.
   
        1)、読みやすいように、JavaではT E K Vなどのアルファベットを使う人がいます.
             これらはコンパイラにとって同じで、任意のアルファベットであってもよい.
            T:Type(タイプ)
            E :  Element
            K:Key(キー)
            V:Value
       
        2)、汎用型のタイプパラメータは参照タイプのみで、
             元のタイプ(int,char,double,longなど)ではありません.
   
   
   
2、?ワイルドカード:任意のタイプを表す   
    List> barList;
    
   
3、?ワイルドカードの拡張
   
    1)上境界を限定する:
    extendsキーワード:このタイプがクラスを継承する必要があることを示します.

    public > T maximum(T x, T y, T z){
        
    }

   
    2)境界を定める   
    superキーワード:このタイプが親である必要があることを示します.

    public class Student super Integer>{
    
    }

   
   
   
七、Javaにおける汎用的な形態
   
1、汎用インタフェース
   

    public interface Calculator {
        public T getNumber();
    }
    
    public class NumberCalculator implements Calculator {
        @Override
        public Number getNumber(){
            return Math.random();
        }
    }

   
   
2、汎用クラス
   

    public class Mapper {
        private K key;
        private V value;

        public Mapper(K k, V v) {
            key = k;
            value = v;
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }

   
   
   
3、汎用方法
   
   

    public class Printer {

        public static  void print(T t) {
            System.out.println(t);
        }
        
        public static  void print(T... args) {
            for (T t : args) {
                System.out.println(t);
            }
        }

        public static void main(String[] args) {
            print("Hello, World!");
            print('a');
            print(123);
            print(34.5);
            print(true);
            
            print("Hello, World!",'a', 12, 34.45, true);
        }
    }

   
   
   
   
   
   
   
   
-
転載は明記してください
原文出典:http://lixh1986.iteye.com/blog/2323917
-