黑马程序员技术交流社区

标题: 为什么可以这样: 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公司规定定义集合时,可以不带泛型,也可以在一边定义泛型(如),哪有几个要注意的地方。
  1. 泛型只是给编译器查看的,在编译后类型信息会被擦除的。所以可以调用反射方法往定义了泛型集合了添加不同类型的对象

  2. ArrayList<E> 称为泛型类型,其中E称为类型变量或类型参数
  3. ArrayList<Integter>称为参数化的类型,integer称为类型参数的实例或实际类型参数
  4. ArrayList<Integer>中 <> 读做Typeof
  5. Array成为原始类型

  6. 参数化类型与原始类型是兼容的如
  7. Conllection<String> c=new Collection();//可以通过编译
  8. Conllection c=new Collection()<String>;//可以通过编译


  9. 参数化类型不考虑类型的继承关系
  10. Vector<String> v=new  Vector<Object>//不可以通过编译
  11. Vector< Object> v=new  Vector< String>//不可以通过编译

  12. Vector< String > v=new  Vector< String>
  13. printCollection(v)//编译不通过,参数化类型不考虑类型的继承关系
  14. Public void printCollection(Collection<Object>)//可以使用通配符?


  15. 在创建数组实例时,数组的元素不能使用参数化类型
  16. Vector<String> v[]=Vector<String>//不可以通过编译
  17. 注:Vector v=new Vector<String> //可以通过编译
  18. Vector< Object> v2=v; //可以通过编译,编译器是严格按照语法一句一句编译的
  19. 泛型化类型会根据根据两者的内容去两者的交集
  20. .add(3,5) //可以通过编译 两个Integer 交集就是Integer
  21. .add(3.5,5)// /可以通过编译 一个float类型与一个integer类型的交集是Number类型
  22. .add(3, "abc")///可以通过编译 一个integer类型与string类型的交集是Object类型

  23. Private static  <T> T add(T x,T y){
  24.         Retrun x ;
  25. }

  26. 注:如果形式参数是泛型参数T,则实参必须是引用类型,在上例中编译器会自动给我装箱成Interger等引用类型 如果是数组,则不会自动装箱
复制代码

作者: chensc    时间: 2013-6-1 09:05
学习学习!
作者: 花开花落总相似    时间: 2013-6-1 09:34
   楼上正解,这样正是为了兼容1.5以前写的程序,如果升级之后你突然发现
之前写的程序全都亮红线,不兼容你的改多少,其他的楼上都说了 我再说一下泛型的特点
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,
让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,
使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。
  你可以通过反射绕过泛型的类型向其中添加一些其他类型的,不过这样又该将错误给用户了,
没什么意义。  嘻嘻   只是说一下自己的理解




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2