-------------------------------------------android培训、期待与您交流 -------------------------------------
泛型:
泛型只是给编译器查看的,在编译后类型信息会被擦除的。所以可以调用反射方法往定义了泛型集合了添加不同类型的对象
ArrayList<E> 称为泛型类型,其中E称为类型变量或类型参数
ArrayList<Integter>称为参数化的类型,integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中 <> 读做Typeof
Array成为原始类型
参数化类型与原始类型是兼容的如
Conllection<String> c=new Collection();//可以通过编译 Conllection c=new Collection()<String>;//可以通过编译
参数化类型不考虑类型的继承关系
Vector<String> v=new Vector<Object>//不可以通过编译 Vector< Object> v=new Vector< String>//不可以通过编译 Vector< String > v=new Vector< String> printCollection(v)//编译不通过,参数化类型不考虑类型的继承关系 Public void printCollection(Collection<Object>)//可以使用通配符?
在创建数组实例时,数组的元素不能使用参数化类型
Vector<String> v[]=Vector<String>//不可以通过编译
注:Vector v=new Vector<String> //可以通过编译
Vector< Object> v2=v; //可以通过编译,编译器是严格按照语法一句一句编译的
泛型化类型会根据根据两者的内容去两者的交集
.add(3,5) //可以通过编译 两个Integer 交集就是Integer
.add(3.5,5)// /可以通过编译 一个float类型与一个integer类型的交集是Number类型
.add(3, "abc")///可以通过编译 一个integer类型与string类型的交集是Object类型
Private static <T> T add(T x,T y){ Retrun x ; }
注:如果形式参数是泛型参数T,则实参必须是引用类型,在上例中编译器会自动给我装箱成Interger等引用类型 如果是数组,则不会自动装箱
异常泛型
在泛型中可以同时有多个类型参数,在定义它们的括号中用逗号分隔,例如
public static void main(String[] args) { fangxing f=new fangxing(); int a= f.add(10, 30);//可以通过编译 Number b=f.add(5.5, 30);//可以通过编译 Object c=f.add(10, "bbbbb");//可以通过编译 f.add(new String[]{"a","b","c"},1,2);//可以通过编译 f.add(new int[]{1,2,3},1,2);//编译不通过 } public <T> T add(T x,T y){ return null; } public <T> T add(T[] x,int y,int z){ T temp=x[y]; x[y]=x[z]; x[z]=temp; return null; } public static <T,M,B> T getValue(T a,M b){ return null; }
泛型的类型推断
通过反射获得泛型的实际参数类型
通过方法获取
如 取得applyVector方法中形式参数Vector的类型类型:
public class fangxing { public static void main(String[] args) throws Exception{ Method applyMethod = fangxing.class.getMethod("applyVector", Vector.class);//通过反射获取方法 Type[] types = applyMethod.getGenericParameterTypes();//获取有泛型的参数Type数组 ParameterizedType pType = (ParameterizedType)types[0];//根据方法有几个参数转为参数化类型 System.out.println(pType.getRawType());//获取参数的原始类型,即class java.util.vector System.out.println(pType.getActualTypeArguments()[0]);//获取实际化类型的参数 } public static void applyVector(Vector<Date> v1){