JAvaの汎用学習


本文は文章の汎型を参考にして詳しく解く
1.概要
汎用型はJDK 1.5以降であり,コンパイル時に型チェックを行うことができ,頻繁な型変換を避けることができる.△汎用型は、明確なタイプの作業をオブジェクトの作成や呼び出し方法に遅らせて明確にする特殊なタイプです.
2.例を挙げる
MapにはStringタイプが保存されていますが、Map.get()はObjectを返しますので、一般的にMap.set()の結果を所望のタイプに強制的に変換します.
Map map = new HashMap();
map.put("key", "value");
String str = (String)map.get("key");
System.out.println("     :"+str);

出力結果:
     :value 
Map map = new HashMap();
map.put("key", 1);
String str = (String)map.get("key");
System.out.println("     :"+str);

出力結果:
java.lang.ClassCastException:
    java.lang.Integer cannot be cast to java.lang.String

プログラムをコンパイルするには、get()の結果を強制的にStringに変換し、結果が本当にStringであることを望んでいます.しかし、このマッピングに保存されているのはStringタイプではないので、上記の例ではClassCastExceptionが投げ出されます.
結論:1つのMapでStringキーをString値にマッピングします.コード内の強制タイプ変換を除去するとともに、誤ったキーや値がセットに保存されないようにする追加のタイプチェックレイヤを得ることができます.これが汎用的な仕事です.JAva言語に汎用型を導入する利点はセキュリティが簡単で、汎用型の利点はコンパイル時にタイプのセキュリティをチェックし、すべての強制変換が自動的で暗黙的で、コードの再利用率を高めることです.
2.汎用知識点
基本使用法、汎用消去、汎用クラス/汎用メソッド/汎用インタフェース、汎用キーワード.
基本的な使い方
    //      
    @Test
    public void TestGenericity_01(){
        //     
        List list = new ArrayList();
        list.add("chenkefo");
        list.add(1);

        //     
        //    
        String str = (String)list.get(0);

        //java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        String srt1 = (String)list.get(1);
    }

    //    
    @Test
    public void TestGenericity(){
        //                
        List<String> list = new ArrayList<String>();
        list.add("chenkefo");
        //The method add(int, String) in the type List is not applicable for the arguments (int)
        //list.add(1);//      

        String str = list.get(0);

    }

汎用消去
汎用はコンパイル期間のみ有効であり,コンパイル後のバイトコードファイルには汎用情報は存在しない.
    public void save(List p){

    }
    //  :          
    public void save(List d){

    }

一般的な書き方
    @Test
    public void TestGenericity1(){
        //      ,          
        List<Object> list = new ArrayList<Object>();
        List<String> list1 = new ArrayList<String>();

        List<Object> list2 = new ArrayList<String>();//  
        //  :           ,         
        List<int> list3 = new ArrayList<int>();
    }

汎用メソッド
    //      
    public  T out(K k,T t){
        return t;
    }
    //    
    @Test
    public void testMethod(){
        //      :          ,      
        System.out.println(out(1,23));
        System.out.println(out("chenkefo","ckf"));
    }

汎用クラス
public class Demo {
    public  T save(K k , T t){
        return t;
    }
    public void update(T t){

    }
    //    
    @Test
    public void test(){
        //   :            ,    
        Demo demo = new Demo();
        demo.save(1, "chenkefo");
    }
}

汎用インタフェース
//    
public interface IBaseDao<T> {
    void save(T t );
    void update(T t );
}

        :             ,                        
public class BaseDao<T> implements IBaseDao<T> {public class PersonDao implements IBaseDao<Person>{

汎用キーワード
    ?     受信値のみ指定
    extends     要素のタイプは、指定したクラスから継承する必要があります.
    super      要素のタイプは、指定したクラスの親でなければなりません.
    汎用キーワード:?
public class App_extends_super {

    //         
    public void save(List> list) {
        //     、  list;      list
    }

    @Test
    public void testGeneric() throws Exception {

        // ?            ,          ;            
        List> list = new ArrayList();
        //list.add("");//   
    }
}

    汎用キーワード:extends【上限】
public class App_extends_super {


    /**
     * list       Double/Float/Integer   
     *       :         Number   (  )
     * @param list
     */
    public void save(List extends Number> list) {
    }

    @Test
    public void testGeneric() throws Exception {
        List list_1 = new ArrayList();
        List list_2 = new ArrayList();
        List list_3 = new ArrayList();

        List list_4 = new ArrayList();

        //   
        save(list_1);
        save(list_2);
        save(list_3);
        //save(list_4);
    }
}

    汎用キーワード:super【下限】
public class App_super {

    /**
     * super      :   String     【  】
     * @param list
     */
    public void save(List super String> list) {
    }

    @Test
    public void testGeneric() throws Exception {
        //       ,    String   
        List list1 = new ArrayList();
        List list2 = new ArrayList();

        List list3 = new ArrayList();
        //save(list3);    
    }
}