黑马程序员技术交流社区

标题: 关于泛型的 [打印本页]

作者: 王晓斌    时间: 2013-1-29 16:32
标题: 关于泛型的
本帖最后由 张向辉 于 2013-1-30 12:03 编辑

在使用泛型时突然发现个小问题~就是如果等号两边泛型写的不一样呢???~~~于是专门搞了个测试,答案出来了,却想不通,求解释~~~

捕获.JPG (36.61 KB, 下载次数: 62)

捕获.JPG

作者: 黑马张英涛    时间: 2013-1-29 17:22
泛型的参数化类型不考虑类型参数的继承关系,详情请看张孝祥老师的java高新技术中有关泛型的讲解。
作者: 刘军亭    时间: 2013-1-29 19:09
泛型的两边应该都是一致的。
ArrayList<String> al3 = new ArrayList<Object>();
ArrayList<Object> al4 = new ArrayList<String>();

参数类型继承不是用在new对象上,而是用在方法上的。
public void method(ArrayList<? extends Object> obj){//这就是一个参数继承的泛型,说明存的是ArrayList参数,ArrayList里面可以装的对象时Object的子类对象
}
作者: 何竹冬    时间: 2013-1-29 19:35
可以把一个原始类型赋值给泛型类型,也可以把泛型类型赋值给原始类型。如果两边都是泛型类型,类型变量不存在继承关系。所以你的下面两个赋值会报错。
作者: 苏克    时间: 2013-1-29 20:12
ArrayList al1 = new ArrayList<Object>();
ArrayList<String> al2 = new ArrayList();
上面两句虽然都通过,但是只有al2泛型起作用,当左右两边只有一边有泛型的时候,左边起作用。
ArrayList<Object> al4 = new ArrayList<String>();
当两边都有的时候两边必须一致。
这是java的一点规则吧,没有为什么呢,除非你研究底层吧,看看java底层是怎么写的。

ArrayList<Object> al4 = new ArrayList<String>();


作者: 杨玲    时间: 2013-1-29 23:07
第一句因为一边确定了泛型的类型一边没确定,所以有敬告,
第二句同理.
第三名,由于泛型的作用主要是限制类型用的,而你在一边明确的规定了要用String类型,另一边又明确的规定了要用Object类型,所以错误,
可以使用? extends 的方式来限制,而你这种作法是已经确定了,而不是限制.如:
  1. ArrayList<? extends Object> al =new ArrayList<String>();//这样就没问题,因为我的左边能接收的是所有继承自Object的类,而不仅仅是Object类
复制代码
第四句和第三句一样.
作者: 冯佩    时间: 2013-1-30 00:01
泛型是JDK1.5以后出现的新特性,之前的版本写法都是:ArrayList al = new ArrayList();JDK1.5以后就是:ArrayList<String> al = new ArrayList<String>();但是新版本要兼容老版本,所以写作ArrayList al = new ArrayList<String>()编译通过,但是不够严谨,所以会有警告。老版本比新版本先出现,所以不可能让老版本去兼容新版本,因此写作ArrayList<String> al = new ArrayList()会编译失败。至于ArrayList<String> al = new ArrayList<Object>()报错的原因是因为此处不是多态,而是泛型限定,String和Object是两个不同的类型。




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