第十二:汎用(下)
3427 ワード
1:
制限されたタイプパラメータ
汎用メカニズムは開発者がタイプパラメータに対して付加的な制約を行うことを可能にする(T extends List......)
2:
自分で簡単な集合を実現する
3:
柔軟に応用して、構想ははっきりしています!!!
四:
汎用型を導入することで、コンパイル時のタイプのセキュリティと実行時にClassCastExceptionsをより小さく投げ出す可能性が得られます.
五:
GenericTest.JAva中的问题:』』』』』』』』』』』』』』』』重点理解!!!
を使うそれともの宣言は、参照インスタンスの情報をこの名前で取得するか、nullに設定されている情報を削除するしかありませんが、その情報を追加することはできません.SomeClassのサブクラスが配置されているだけで、どのクラスのインスタンスなのか分かりません.コンパイラは情報を追加させません.理由は、情報を追加できる場合、取り戻したインスタンスのタイプを覚えておく必要があります
そして元のタイプに変換して操作できるようになると,汎用的な使用の意味が失われる.
六:
汎用クラスの継承
汎用クラスは汎用インタフェースの補充問題を実現する:私が今まとめた少しの結論1.クラスを作成するときにT(絶対に使用できません?)2.?インスタンス化されたオブジェクトとメソッド(パラメータ)で使用できます.
制限されたタイプパラメータ
汎用メカニズムは開発者がタイプパラメータに対して付加的な制約を行うことを可能にする(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.?インスタンス化されたオブジェクトとメソッド(パラメータ)で使用できます.