泛型的高级应用:
定义泛型方法
1、Java中的泛型方法没有C++中的模板函数功能强大。
2、只有引用类型才能作为泛型方法的实际参数:
单独的数字1、2、3可以作为实际参数,因为会自动装箱成Integer对象。
而数组new int[]{1,2,3}不可以,因为数组已经是一个对象了,不会再拆了自动装箱。
3、普通方法、构造方法、和静态方法中都可以定义泛型。
4、可以用泛型变量表示异常,称为参数化的异常(不常用)。
类型参数的类型推断:
编译器判断泛型方法的实际类型参数的过程称为类型推断。类型推断是相对于直觉推断的。
自己总结:
同类是同类,不同是公倍。(同类包括一种类型只出现一次和出现多次)
同时参数类型具有传递性。
定义泛型类:
当一个类中多个方法在使用同一个实际类型参数时,就需呀将泛型类型定义在类中,即:
class Demo<E>{
private E field1;
public T getByID(){}
}
类中的静态方法不能使用定义在类中的类型参数,以为泛型是属于对象的,而静态方法随着类的加载而加载进内存,即不用创建对象就可以利用类名调用而使用,它优先于对象存在,所以不行。
通过反射技术获得泛型的参数化类型:
记住:通过对象不能得到泛型类型,但是可以通过以该对象为实例参数的方法通过反射获得方法参数上的泛型的参数化类型。
public class GenericReflect
{
public static void main(String[] args) throws Exception
{
//用反射技术无法直接用ArrayList的实例对象获得它的泛型类型。
HashMap<String,Integer> map = new HashMap<String,Integer>();
//用反射技术可以通过将该对象作为实际参数的方法来获得泛型类型。
Method swapmMethod = GenericReflect.class.getMethod("swapList", HashMap.class);
Type[] types = swapmMethod.getGenericParameterTypes();
for(Type type : types)
{
System.out.println(type);
//结果是:java.util.HashMap<java.lang.String, java.lang.Integer>
}
}
public static void swapList(HashMap<String,Integer> map)
{
}
}