JAVAの汎用型&&JAVAのいくつかのfor循環方式

4102 ワード

汎用型(Generic typeまたはgenerics)は、Java言語のタイプシステムの拡張であり、タイプ別にパラメータ化できるクラスの作成をサポートする.汎用的な本質は、パラメータ化タイプ、すなわち操作するデータ型がパラメータとして指定されることである.タイプパラメータは、パラメータ化タイプを使用するときに指定されるタイプのプレースホルダと見なすことができる.
汎用型がない場合,タイプObjectの参照によりパラメータの「任意化」を実現することは,明示的な強制型変換を行うことであり,この変換は開発者が実際のパラメータタイプを予知できる場合に行うことを要求するという欠点がある.強制タイプ変換エラーの場合、コンパイラはエラーを提示せず、実行時に異常が発生する可能性があります.これはセキュリティ上の危険です.汎用型の利点は、コンパイル時にタイプのセキュリティをチェックし、すべての変換が暗黙的であることです.
(1)汎用的なルール
A,汎用型のタイプパラメータはクラスタイプ(カスタムクラスを含む)のみであり,単純タイプではない.
Bは、同じ汎用型が複数のバージョンに対応することができる(パラメータタイプが不確定であるため).
C,汎用型のタイプパラメータは複数あり得る.
(2)2つの例.前者は汎用ではなく、後者は汎用である
class Gen2{
	private Object ob;   // Object         
	public Gen2(Object ob){
		this.ob = ob;
	}
	
	public Object getOb(){
		return ob;
	}
	
	public void setOb(Object ob){
		this.ob = ob;
	}
	
	public void showType(){
		System.out.println("T real type:"+ob.getClass().getName());  //                 	        }
}

public class TestNew {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Gen2 intOb = new Gen2(new Integer(88));	
		intOb.showType();
 		int i = (Integer)intOb.getOb();		
       		System.out.println("value = "+i);
   		System.out.println("--------------------------");
		
		Gen2 strOb = new Gen2("hello gen!");	
		strOb.showType();
		String s = (String)strOb.getOb();
		System.out.println("value = "+s);
	}
}    

実行結果:
T real type:java.lang.Integer value = 88 -------------------------- T real type:java.lang.String value = hello gen! 次のプログラムの実行結果も上と同じです.
class Gen<T>{			//      T
	private T ob;    //       
	public Gen(T ob){
		this.ob = ob;
	}
	
	public T getOb(){
		return ob;
	}
	
	public void setOb(T ob){
		this.ob = ob;
	}
	
	public void showType(){
		System.out.println("T real type:"+ob.getClass().getName());
	}
}

public class TestNew {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Gen<Integer> intOb = new Gen<Integer>(88);	//            ,      
		intOb.showType();
		int i = intOb.getOb();
		System.out.println("value = "+i);
		System.out.println("--------------------------");
		
		Gen<String> strOb = new Gen<String>("hello gen!");
		strOb.showType();
		String s = strOb.getOb();
		System.out.println("value = "+s);
	}
}

=============================================================================================
Javaプログラムでは,ある配列やCollectionの要素を「逐一処理」——,「遍歴」——「遍歴」する場合,一般にforループを用いて実現する.(1)配列を巡る従来方式
		int[] integers = {1,2,3,4};
		for(int j=0;j<integers.length;j++){
			int i = integers[j];
			System.out.println(i);

(2)Collectionオブジェクトを巡る従来の方法
import java.util.Collection;
import java.util.Iterator;

public class TestNew {	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*     Collection */
		String[] strings = {"A", "B","C","D"};
		Collection stringList = java.util.Arrays.asList(strings);
  		/*      */
		for (Iterator itr = stringList.iterator(); itr.hasNext();) {
		    Object str = itr.next();
		    System.out.println(str);
		}
	}
}

ListもCollectionの一種なのでjavaが利用できる.util.Collection.iterator().
(3)Java言語のJ 2 SE 1.5バージョン以降、別の形式のforループが導入された.この形式のforループにより、より簡単な方法でループの作業ができるようになった.Javaの第2のforループは基本的に、for(ループ変数タイプループ変数名:ループ対象)ループ体
この構文を使用すると、配列を巡回する操作で、次のような書き方ができます.
	public static void main(String[] args) {
		int[] integers = {4,5,6,7};

		for (int i : integers) {
		     System.out.println(i); 
		 }
	}
ここで使用されるforループは、コンパイル中にこのような形式と見なされます.
for (int      = 0;      < integers.length;     ++) {
     System.out.println(integers[    ]); 
 }
(4)に対応していますが、1つのCollectionを巡る操作にも簡単な書き方があります.詳しくは言いません.
 
参考原文:http://baike.baidu.com/view/1436058.htm
参考原文:http://www.jb51.net/article/35884.htm
参考原文:http://blog.csdn.net/sun_abc/article/details/5906765