1、泛型是给java编译器使用的,在源文件经过编译后,编译器会将类型信息去掉,所以
testList<String> ls = new ArrayList<String>();
List<Boolean> ls1 = new ArrayList<Boolean>();
System.out.println(ls==ls1) ;
//true;
2、可以绕过编译器的类型信息检查,而直接加入对象
testimport java.util.* ;
import java.lang.* ;
public class Fanx {
public static void main (String args[]) {
ArrayList<Integer> ls = new ArrayList<Integer>();
try{
ls.getClass().getMethod("add", Object.class).invoke(ls,"abc") ;
}catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(ls.get(0));
}
}//out:abc
3、泛型通配符
testpublic static void printCollection(Collection<?> coll) {
//可以传Collection<String>,Collection<Integer>,Collection<Boolean>等等,但在此方法内不能使用诸如coll.add(“Strin”)这样具有类型信息的方法
for(Object obj:coll){
System.out.println(obj);
}//coll.add(“str”); 报错
}
4、限定通配符上边界,限定通配符上边界
testpublic static void printCollection1(Collection<? extends Number> coll) {
//
for(Object obj:coll){
System.out.println(obj);
}
}
//printCollection1(new ArrayList<Integer>()) ;//不报错
//printCollection1(new ArrayList<String>()) ; //报错,传入泛型参数必须为Number的子类
testpublic static void printCollection2(Collection<? super Number> coll) {
//
for(Object obj:coll){
System.out.println(obj);
}
}
//printCollection1(new ArrayList<Integer>()) ;//不报错
//printCollection1(new ArrayList<String>()) ; //报错,传的参数化必须是以Number为父类
5、自定义泛型方法
testpublic <T> T swap(T[] t,int i,int j){
T temp = t[i] ;
t[i] = t[j] ;
t[j] = t[i] ;
return (T) t ;
}
6、类级别泛型
testpublic class Dao<T> {
public <T> T getEntity(int id){
return null;
}
}
7、通过反射获得泛型的实际类型参数
testimport java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Map;
import java.util.Vector;
//假如我们要想获得 Vector<Date> v = new Vector<Date>(); v的实际类型参数
//我们必须写一个如applyRef的方法
public class Dao {
public void applyRef1(Map<String,Integer> map,Vector<Date> v){
}
public static void main(String[] args) {
try {
Method method = new Dao().getClass().getMethod("applyRef1", Map.class,Vector.class) ;
Type[] pType = method.getParameterTypes();
Type[] neiType = method.getGenericParameterTypes();
System.out.println(pType[0]) ;
System.out.println(pType[1]) ;
System.out.println(neiType[0]) ;
System.out.println(neiType[1]) ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}