泛型
诸如ArrayList<String> array = new ArrayList<String>()的应用,在声明对象时以<>指明类型参数的应用,叫泛型.泛型是编译器阶段的内容,运行时是去类型化的.
术语:
整个ArrayList<E>称为泛型类型
ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念typeof
ArrayList称为原始类型
参数化类型不考虑类型参数的继承关系
ArrayList<Object> array = new ArrayList<String>();//错误
ArrayList<String> array = new ArrayList<Object>();//也错误
但是ArrayList array = new ArrayList<String>();和ArrayList<String> array = new ArrayList();是没错的,因为参数化类型和原始类型兼容.数组不适用泛型.
泛型的?通配符及扩展
Class<?>表示类型参数是任意类型
Class<? Extends U>表示类型参数是U或U的子类
Class<? Super U>表示类型参数是U或U的父类
Java提供了两种类型的集合,Collection类型集合和Map类型集合.Collection集合是单列的,其中增加的每一个元素都为一个单独的对象;Map集合是双列的,增加的每一个元素都包含两个对象,即键和值.Map集合的每个元素都是一个键对象和值对象的组合,Map集合的主要特点就是可以从其中检索出一个键对象的对应值对象,如同英汉词典的对照表功能.
一个Map元素可以用一个Map.Entr对象表示,一个Map.Entry就包含一个key和一个对应的value;因为Map未实现Iterable接口,无法进行迭代操作,所以我们要把Map转成一个Set集合进行迭代,Set<Map.Entry<String,Integer>> entrySet = new Map<String,Integer>().entrySet();
自定义泛型方法的应用,用于放置泛型类型参数的<>应该在方法的所有其他修饰符之后在方法的返回值前.例如Public static <T> void method(){}.extends和super也可以在定义时使用,用法相同.
也可以在异常中使用自定义泛型,但是不可以使用在catch上,可以在catch的处理语句中.