泛型复习
回顧泛型類
泛型類:具有一個或多個泛型變量的類被稱之為泛型類
1、class A<T>{
}
2、在創(chuàng)建泛型實例時,需要為其類型變量賦值
A<String> a=new A<String>();
*如果創(chuàng)建實例時,不給類型變量賦值,那么會有一個警告!
3、泛型方法:具有一個或多個類型變量的方法,稱之為泛型方法!
class A<T>{
public T fun(T t1){}
}
fun()方法不是泛型方法!它是泛型類中的一個方法!
public <T> T fun(T t1){} -->它是泛型方法
*泛型方法和泛型類沒有什么關(guān)系,泛型方法不一定非要在泛型類中!
4、泛型在類中或者方法中的使用
*泛型類中使用泛型:
>成員類型
>返回值類型和參數(shù)類型
>局部變量的引用上
class A<T>{
private T bean;//泛型可在成員變量上使用
public T fun(T t){}//泛型可以在類中的方法上(返回值和參數(shù)類型)使用!
public void fun2(){//泛型還可以在局部變量的引用類型上使用
T b=...
new T();//不行的
}
}
=====================================
5、泛型的繼承和實現(xiàn)
class A<T>{}
class AA extends A<String>{} //不是泛型類,只是它爸爸是泛型類!
5.1 繼承泛型類
*子類不是泛型類:需要給父類傳遞類型常量
>當給父類性傳遞的類型常量為String時,那么在父類中所有T都會被String替換
*子類是泛型類:可以給父類傳遞類型常量,也可以傳遞泛型變量
class AA1 extends A<Integer>{}
class AA3<E1> extends A<E1>(){}
============================================
泛型的通配符
1、通配符的使用場景
方法的形參!
2、通配符的優(yōu)點
使方法更加通用!
3、通配符分類
無界通配 ?
子類限定:? extends Object
父類限定:? super Integer
4、通配符缺點
使變量使用上不再方便
無界:參數(shù)和返回值為泛型的方法不能使用
子類:參數(shù)為泛型的方法不能使用
父類:返回值為泛型的方法不能使用
5、比較通配符
boolean addAll(Collection<E> c)
List<Number> numList=new ArrayList<Number>();
List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);//編譯失敗
boolean addAll(Collection<? extends E> c)
List<Number> numList=new ArrayList<Number>();
List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);
?
package cn.itcast;import org.junit.Test;public class Demo1 {@Testpublic void fun1(){AA3<Long> aa3=new AA3<Long>();} } class A<T>{private T t;public T fun1(){return t;}public void fun2(T t){this.t=t;}}class AA1 extends A<Integer>{} class AA2 extends A<String>{}class AA3<E> extends A<E>(){ }package cn.itcast;import java.util.ArrayList; import java.util.List;import org.junit.Test;public class Demo2 {@Testpublic void fun1(){Object[] objs=new Object[10];List list=new ArrayList();String[] strs=new String[10];List<String> strList=new ArrayList<String>();Object[] objArray=new String[10];objArray[0]=new Integer(100);//java.lang.ArrayStoreException: java.lang.Integer// List<Object> objList=new ArrayList<String>();/** 泛型引用和創(chuàng)建兩端,給出的泛型變量必須相同!*/}public void fun2(){List<Integer> integerList=new ArrayList<Integer>();print(integerList);//List<Object> list=new ArrayList<Integer>(); List<String> strList=new ArrayList<String>();print(strList);}/** 這個?就是通配符* 通配符只能出現(xiàn)在左邊!,即不能再new時使用通配符!!!* List<? extends Object> list=new ArrayList<String>();*//** ?它表示一個不確定的類型,它的值會在調(diào)用時調(diào)用下來*/public void print(List<?> list){/** 當使用通配符,對泛型類中參數(shù)為泛型的方法起到了副作用*///list.add("hello");/** 當使用通配符時,泛型類中返回值為泛型的方法也作廢了*/Object s=list.get(0);/** 通配符的好處:可以使泛型類型更加通用!尤其是在方法調(diào)用時形參使用通配符*/}public void fun3(){List<Integer> intList=new ArrayList<Integer>();print1(intList);List<Long> lonList=new ArrayList<Long>();print1(lonList);// List<String> strList=new ArrayList<String>(); // print1(strList); }/** 給通配符添加了限定* 只能傳遞Number或其子類* 子類統(tǒng)配對通用性產(chǎn)生了影響,但使用形參更加靈活*/public void print1(List<? extends Number> list){/** 參數(shù)為泛型的方法還是不能使用*/ // list.add(new Integer(100));/** 返回值為泛型的方法可用*/Number number=list.get(0);}public void fun4(){List<Integer> intList=new ArrayList<Integer>();print2(intList);// List<Long> lonList=new ArrayList<Long>(); // print2(lonList); List<Object> objList=new ArrayList<Object>();print2(objList);}/** 給通配符添加了限定* 只能傳遞Integer類型,或其父類型*/public void print2(List<? super Integer> list){/** 參數(shù)為泛型的方法可以使用了*/list.add(new Integer(100)); // Integer int1=list.get(0);/** 返回值為泛型的方法,還是不能使用*/Object obj=list.get(0);}}?
反射獲取類上面的泛型信息:
package cn.itcast.demo1;import java.lang.reflect.ParameterizedType;import org.junit.Test;public class Demo1 {@Testpublic void fun1(){new C();}}class A<T>{public A(){/** 在這里獲取子類傳遞的泛型信息*/ // Type type=this.getClass().getGenericSuperclass();//獲取父類的參數(shù)化類型 格式為A<String>或。。。 // ParameterizedType pType=(ParameterizedType) type; // Class c=(Class) pType.getActualTypeArguments()[0];//參數(shù)的Class數(shù)組Class c=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println(c.getName());} } class B extends A<Integer>{} class C extends A<String>{} View Code?
總結(jié)
- 上一篇: 浪潮之巅读后感
- 下一篇: 求给定精度的简单交错序列部分和_单个神经