之所以可以这样写是因为:jdk在推出泛型技术后为了兼容以前没用泛型技术的程序,试下如果你开发了一个大型程序,在升级jdk版本后,突然发现必须使用泛型,哪有多少好改动的,所用sun公司规定定义集合时,可以不带泛型,也可以在一边定义泛型(如),哪有几个要注意的地方。- 泛型只是给编译器查看的,在编译后类型信息会被擦除的。所以可以调用反射方法往定义了泛型集合了添加不同类型的对象
- 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等引用类型 如果是数组,则不会自动装箱
复制代码 |