在1.5之前,没有泛型,在往集合中存入数据时无法限制存入的数据类型.
Jdk 1.5的集合类希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以外的数据
ArrayList<Integer> collection = new ArrayList<Integer>();
尖括号中的就是泛型,这个集合只能存入Integer类型的数据.存入其他类型数据编译器会报错.
1.ArrayList<Integer>中涉及的专业术语
整个ArrayList<E>称为泛型类型
ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念着typeof
ArrayList称为原始类型
2.关于原始类型和参数化类型的兼容
ArrayList<Integer> collection=new ArrayList();
ArrayList collection=new ArrayList<Integer>();
以上两种都可以通过编译,但是会报安全警告.
ArrayList<Object> collection3=new ArrayList<String>();
这种写法无法通过编译.
:原始类型可以引用参数化类型的对象,参数化类型也可以引用原始类型的对象.
参数化类型不考虑类型参数的继承关系.
思考:
Vector v1 = new Vector<String>();
Vector<Object> v = v1;
上面的代码不会报错,编译器一行一行的检查语法,编译期没错.
3.编译器不允许创建泛型变量的数组.也就是创建数组实例时,数组元素不能是参数化的类型.(不知道为什么,但是确实创建不了)
4.?在泛型中时通配符便是任意类型.
限定通配符的上边界:
正确:Vector<? extends Number> x = new Vector<Integer>(); //Integer是Number的子类
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();//Number是Integer的父类
错误:Vector<? super Integer> x = new Vector<Byte>();
注意:
限定通配符总是包括自己。
?只能用作引用,不能用它去给其他变量赋值
Vector<? extends Number> y = new Vector<Integer>();
Vector<Number> x = y;//这行代码是错误的. 因为不可以把?赋给Number.
6.泛型中只能定义引用数据类型,不可以定义基本数据类型.也就是必须是Object的子类......(说白了泛型省去了使用Object时类型的强转).
7.泛型也可以定义在方法中.需要在返回值类型前声明.
8.也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。