JAva汎用とカスタム汎用の使用について


汎用的な適用はjavaでも一般的であり、jdk 1.5以前に、1つのStringタイプのオブジェクトを1つのセットに追加すると、プログラマーの不注意でStringタイプのオブジェクトが他のタイプのオブジェクトに変換される場合がある.したがって,汎用的な出現は,オブジェクトが特性を失う問題を解決した.
     汎用的な使用は、ClassCastExceptionが発生しないようにコンパイラに見せます.同時に、効率を向上させるために、コンパイルされたclassは、以前の汎用情報をアクティブに消去します.
     汎用の使用シーンは一般的に集合であり、定義されていない汎用と定義された汎用の集合の違い:
	//       List  
	public void noGenerics(){
		List list = new ArrayList<>();
		list.add(new Date());
		Date myDate = (Date) list.get(0);
		System.out.println(myDate);
	}
	//      List  
	public void haveGenerics(){
		List<Date> list = new ArrayList<Date>();
		list.add(new Date());
		Date myDate = list.get(0);
		System.out.println(myDate);
	}
上記のコードから分かるように、汎用型の集合は使用されず、オブジェクトが集合に格納された後、オブジェクトが取り出されると、そのオブジェクトがどのようなタイプであるか分からないため、強い回転の動作が加わった.汎用型を使う便利さは,その出たオブジェクトが本来定義された汎用型であり,強転を必要とせず,エラーの可能性を減らすことである.
カスタム汎用:汎用は先に宣言し、メソッド修飾語の後にを宣言するか、複数のを宣言します.複数のメソッドが汎用に使用されている場合は、public class HelloWorld{...}のように、クラス名に直接汎用またはを宣言することができます.クラスで宣言された汎用は、静的メソッドでは使用できません.
import java.util.Date;

public class GenericsTest {

	public static void main(String[] args) {
		printObject(new Date());
		printObject("java");
	}
	//        ,      ,   。
	public static <T> void  printObject(T t) {
		System.out.println(t.toString());
	}
	//        ,         
	public static <T, E, K> void printObject(T t, E e, K k) {
		//.....
	}
}

次に、汎用型を使用して、任意のタイプの配列を逆にする方法を示します.
public class Test {

	public static void main(String[] args) {
		Integer arr[] = { 2, 5, 7, 4, 8 };
		reverse(arr);
		for (int i : arr) {
			System.out.println(i);
		}
	}
	//             。
	public static <T> void reverse(T arr[]) {
		int start = 0;
		int end = arr.length - 1;
		while (true) {
			if (start >= end) {
				break;
			}
			T temp = arr[start];
			arr[start] = arr[end];
			arr[end] = temp;
			start++;
			end--;
		}
	}
}