ダークホースプログラマー_Javaハイテク_その三_汎用型

8065 ワード

------ androidトレーニングJAvaトレーニング、java基礎学習技術総括、ご交流お待ちしております!------- 
    汎用型
      体験汎用   jdk 1.5以前の集合クラスでどのような問題があったか   ArrayList collection1=new ArrayList();          collection1.add(1);          collection1.add(1L);          collection1.add("abc");          int i=(Integer)collection1.get(1);//コンパイル時に他のi行の変換を強制し、実行時にエラーが発生しました.    jdk 1.5の集合クラスは、集合を定義するときに、集合にどのタイプのデータを入れるかを明確に示すことを望んでいます.    指定されたタイプの予期せぬデータを追加     ArrayList  collection2=new ArrayList();         collection2.add(1); //コンパイル時にエラーを報告         collection2.add(1L); //コンパイル時にエラーを報告          collection2.add("abc");          String str=collection2.get(0);//強制変換は不要          汎用型はjavacコンパイラに提供され、セット内の入力タイプを限定し、コンパイラがソースプログラムの          不正に入力すると、コンパイラがタイプ説明付きの集合をコンパイルすると「タイプ」情報が除去され、プログラムの実行効率に影響を与えません.          パラメータ化された汎用タイプの場合、getClass()メソッドの戻り値は元のタイプとまったく同じで、ある汎用セットに移動できます.          他のタイプのデータを加え、例えば反射で集合を得てaddメソッドを呼び出すとよい.    汎用性の理解    ArrayListクラス定義およびArrayListクラス参照には、次の用語が含まれます.    全体をArrayList汎用タイプまたはタイプパラメータと呼ぶ    ArrayList全体をパラメトリックタイプと呼ぶ    ArrayListのIntegerをタイプパラメータと呼ぶインスタンスまたは実際のタイプのパラメータ    ArrayListのIntegerでtypeofと呼ぶ    ArrayListを元のタイプと呼ぶ    パラメトリックタイプと元のタイプの互換性:    パラメトリックタイプは、元のタイプのオブジェクトを参照し、レポート警告をコンパイルします.たとえば、    Collection c=new Vector();    元のタイプは、パラメトリックタイプのオブジェクトを参照し、コンパイル時に警告を報告します.たとえば、次のようにします.    Collection c=new Vector();    パラメトリックタイプは、タイプパラメータの継承関係を考慮しません.    Vecor v=new Vector();//エラー;    Vector v=new Vector();//エラーも    コンパイラでは、タイプ変数の配列を作成できません.すなわち、配列インスタンスを作成するときに、配列要素はパラメータ化できません.    のタイプです.たとえば、次の文にエラーがあります.      Vector vector[]=new Vector[10];      思考問題:次のコードはエラーを報告しますか?      Vector v1=new Vector();      Vector v=v1;    汎用型の?ワイルドカード    質問:    任意のパラメトリックタイプのセットのすべてのデータを印刷する方法を定義します.この方法はどのように定義しますか?    エラー:    public static void printCollection(Collection cols){    for(Object obj:cols){    System.out.println(obj);    }    cols.add("String");//間違いない    cols=new HashSet();//エラーが報告されます!    正しい方法:     public static void printCollection(Collection cols){     for(Object obj:cols){     System.out.println(obj);     }     cols.add("String");//エラー、未来マッチングがStringに違いないことを知らないため     cols.size();//そう、この方法はパラメータとは関係ありません     cols=new HashSet();     まとめ:     使用?ワイルドカードは他のパラメータ化タイプを参照できます.?ワイルドカードで定義された変数は主に参照として使用されます.     パラメータに関係のないメソッドを呼び出すことができ、パラメータ化に関連するメソッドを呼び出すことはできません.     汎用のワイルドカードの拡張     ワイルドカードの上部境界を定義するには、次の手順に従います.     正しい:Vectorx=new Vector();     エラー:Vectorx=new Vector();     ワイルドカードの下の境界を定義します.     正しい:Vectorx=new Vector();     エラー:Vectorx=new Vector();     ヒント:     ワイルドカードを限定するには、常に自分自身が含まれます.     汎用集合の統合    次のコードを書くことができるのは、JAVAの汎用集合クラスを把握していることを意味します.    HashMap hm=new HashMap();    hm.put("zxx",19);    hm.put("lis",18);    Set> mes=hm.entrySet();    for(Map.Entry me:mes){    System.out.println(me.getKey()+":"me.getValue());    jspページでもsetまたはmapセットを反復することがよくあります.          ${entry.key}:${entry.value}            C++のテンプレート関数からカスタム汎用を導入   次の関数の構造は似ていて、タイプだけが違います.   int add(int x,int y){   return x+y;   }   float add(float x,float y){   return x+y;   }   汎用メソッドの定義   JAvaの汎用メソッドはC++テンプレート関数の機能が強くなく、javaの次のコードはコンパイルできません.   T add(T x,T y){   return(T)(x+y);  //return null;    }    配列内の2つの要素の位置を交換する汎用メソッド構文は、次のように定義されます.    static void swap(E[] a,int i,int j){    E t=a[i];    a[i]=a[j];    a[j]=t;    }    汎用型のタイプパラメータを配置するために使用されるカッコは、メソッドの他のすべての修飾子の後に表示され、メソッドの戻りタイプの前にも表示されます.    値を返す直前です.通常、タイプパラメータは単一の大文字で表されます.    汎用メソッドの実際のパラメータとして使用できるのは、適用タイプのみです.swap(new int[3],3.5).文はコンパイルエラーを報告します.    汎用を適用する場合にextends修飾子を使用することができるほか、汎用を定義する場合にextends修飾子を使用することもできる.例えば、    Class.getAnnotation()メソッドの定義.複数の境界を&で指定できます.    void method(){}    汎用メソッド、構築メソッド、静的メソッドでは、汎用メソッドを使用できます.コンパイラでは、タイプ変数配列の作成も許可されません.    パラメータ化された例外と呼ばれるタイプ変数で異常を表すこともでき、メソッドのthrowsリストで、    ただしcatch句では使用できません.    汎用型では、複数のタイプのパラメータを同時に使用できます.たとえば、定義されたカッコにカンマを使用します.    public static V getValue(K key){    return map.get(key);}
     例1:
public class GenericTest {
	public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
		// TODO Auto-generated method stub
        /*  ArrayList collection1=new ArrayList();
          collection1.add(1);
          collection1.add(1L);
          collection1.add("abc");
          int i=(Integer)collection1.get(1); */
          ArrayList<String>  collection2=new ArrayList();
         // collection2.add(1);
          //collection2.add(1L);
          collection2.add("abc");
          String str=collection2.get(0); 
          Constructor constructor1=String.class.getConstructor((StringBuffer.class));
      	String str2=(String) constructor1.newInstance(new StringBuffer("abc"));//            
      	System.out.println(str2); 
      	ArrayList<Integer> collection3=new ArrayList();
      	System.out.println(collection3.getClass()==collection2.getClass());
      	//collection3.add("abc");  
      	collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
      	System.out.println(collection3.get(0)); 
         
           printCollection(collection3);
           
           
           HashMap<String,Integer> maps=new HashMap<String,Integer>();
           maps.put("zxx",28);
           maps.put("lhm",35);
           maps.put("flx",33);
           Set<Map.Entry<String,Integer>> entrySet=maps.entrySet();
           for(Map.Entry<String,Integer> entry:entrySet){
          	 System.out.println(entry.getKey()+":"+entry.getValue());
           }
          	 add(3,5);
          	 Number x1=add(3.5,3);
          	 Object str6=add(3,"abc");
          	 swap(new String[]{"abc","xyz","itcast"},1,2);
          	 //swap(new int[]{1,3,5,4,5),3,4};          
          	 
          	 
        		   
	}
     public static void printCollection(Collection<?> collection){
    	 //collection.add("abc");
    	 System.out.println(collection.size());
    	 for(Object obj:collection){
    		 System.out.println(obj); 
    	 }
     }
     //Class<Number> x=String.class.asSubclass(Number.class);
     //Class<?> y;
     //Class<String> x;//Class.forName("java.lang.String");
      //y=x;
    public static <T> void swap(T[] a,int i,int j){
    	T tmp=a[i];
    	a[i]=a[j];
    	a[j]=tmp;
    }
      
     private static <T> T  add(T x,T y){
    	  return null;
      }
}
 
 例3:
 
 
            ------ androidトレーニングJAvaトレーニング、java基礎学習技術総括、ご交流お待ちしております!-------