第十二:汎用(下)

3427 ワード

1:
制限されたタイプパラメータ
汎用メカニズムは開発者がタイプパラメータに対して付加的な制約を行うことを可能にする(T extends List......)
public class ListGenericFoo<T extends List> {
	private T[] fooArray;

	public T[] getFooArray() {
		return fooArray;
	}

	public void setFooArray(T[] fooArray) {
		this.fooArray = fooArray;
	}

	public static void main(String[] args) {
		ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
		ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();

		LinkedList[] linkedList = new LinkedList[10];
		foo1.setFooArray(linkedList);

		ArrayList[] arrayList = new ArrayList[10];
		foo2.setFooArray(arrayList);
		
		//HashMap List 
		//ListGenericFoo<HashMap> foo3=new ListGenericFoo<HashMap>();
	}
}

2:
自分で簡単な集合を実現する
//  
public class SimpleCollection<T extends Object> {
	private T[] objArr;//  

	private int index = 0;

	public SimpleCollection() {
		objArr = (T[]) new Object[10];//  ... 10
	}

	public SimpleCollection(int capacity) {
		objArr = (T[]) new Object[capacity];//  
	}

	//  
	public void add(T t) {
		objArr[index] = t;
		index++;
	}

	//  
	public int getLength() {
		return index;
	}

	//  
	public T get(int i) {
		return objArr[i];
	}

	// 
	public int size(){
		return objArr.length;
	}
	public static void main(String args[]) {
		SimpleCollection<Integer> c = new SimpleCollection<Integer>();
		for (int i = 0; i < 10; i++) {
			System.out.println("<<<<<<<<<<<<<<<<<<<<<<"+c.getLength());
			System.out.println(">>>>>>>>>>>>>>>>>>>>>>"+c.size());
			c.add(new Integer(i));//  
		}
		for (int i = 0; i < 10; i++) {
			System.out.println(c.get(i));
		}
	}
}

3:
柔軟に応用して、構想ははっきりしています!!!
四:
汎用型を導入することで、コンパイル時のタイプのセキュリティと実行時にClassCastExceptionsをより小さく投げ出す可能性が得られます.
五:
GenericTest.JAva中的问题:』』』』』』』』』』』』』』』』重点理解!!!
を使うそれともの宣言は、参照インスタンスの情報をこの名前で取得するか、nullに設定されている情報を削除するしかありませんが、その情報を追加することはできません.SomeClassのサブクラスが配置されているだけで、どのクラスのインスタンスなのか分かりません.コンパイラは情報を追加させません.理由は、情報を追加できる場合、取り戻したインスタンスのタイプを覚えておく必要があります
そして元のタイプに変換して操作できるようになると,汎用的な使用の意味が失われる.
public class GenericTest<T> {
	private T foo;

	public T getFoo() {
		return foo;
	}

	public void setFoo(T foo) {
		this.foo = foo;
	}

	public static void main(String[] args) {
		GenericTest<? extends List> ge = null;
		ge = new GenericTest<ArrayList>();
		ge = new GenericTest<LinkedList>();
		// ge=new GenericTest<HashMap>();// 

		GenericTest<?> g = null;
		g = new GenericTest<HashMap>();

		GenericTest<? super List> ge2 = null;//  ...List List !!!
		ge2 = new GenericTest<Object>();
		// ge2=new GenericTest<ArrayList>();// 

		GenericTest<String> ge3 = new GenericTest<String>();
		ge3.setFoo("hello world");

		GenericTest<? extends Object> ge4 = ge3;
		System.out.println(ge4.getFoo());
		ge4.setFoo(null);// null, ... ...
		//  , , !
		System.out.println(ge4.getFoo());
		// ge4.setFoo("welcome");// ??? !!!!!!

	}
}

六:
汎用クラスの継承
汎用クラスは汎用インタフェースの補充問題を実現する:私が今まとめた少しの結論1.クラスを作成するときにT(絶対に使用できません?)2.?インスタンス化されたオブジェクトとメソッド(パラメータ)で使用できます.