黑马程序员技术交流社区
标题:
为什么可以这样: Collection<String> c = new Vector();
[打印本页]
作者:
librazeng
时间:
2013-6-1 08:18
标题:
为什么可以这样: Collection<String> c = new Vector();
参数化类型可以引用一个原始类型的对象,编译报告警告,例如, Vector<String> c = new Vector();
为什么可以这样子啊?这语法看着怪怪的。
作者:
刘海芳
时间:
2013-6-1 08:37
之所以可以这样写是因为: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等引用类型 如果是数组,则不会自动装箱
复制代码
作者:
chensc
时间:
2013-6-1 09:05
学习学习!
作者:
花开花落总相似
时间:
2013-6-1 09:34
楼上正解,这样正是为了兼容1.5以前写的程序,如果升级之后你突然发现
之前写的程序全都亮红线,不兼容你的改多少,其他的楼上都说了 我再说一下泛型的特点
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,
让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,
使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。
你可以通过反射绕过泛型的类型向其中添加一些其他类型的,不过这样又该将错误给用户了,
没什么意义。 嘻嘻 只是说一下自己的理解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2