A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王晓斌 中级黑马   /  2013-1-29 16:32  /  2303 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-30 12:03 编辑

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

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

捕获.JPG

6 个回复

正序浏览
冯佩 中级黑马 2013-1-30 00:01:32
7#
泛型是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是两个不同的类型。
回复 使用道具 举报
第一句因为一边确定了泛型的类型一边没确定,所以有敬告,
第二句同理.
第三名,由于泛型的作用主要是限制类型用的,而你在一边明确的规定了要用String类型,另一边又明确的规定了要用Object类型,所以错误,
可以使用? extends 的方式来限制,而你这种作法是已经确定了,而不是限制.如:
  1. ArrayList<? extends Object> al =new ArrayList<String>();//这样就没问题,因为我的左边能接收的是所有继承自Object的类,而不仅仅是Object类
复制代码
第四句和第三句一样.
回复 使用道具 举报
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>();

评分

参与人数 1黑马币 +8 收起 理由
黄锦成 + 8

查看全部评分

回复 使用道具 举报
可以把一个原始类型赋值给泛型类型,也可以把泛型类型赋值给原始类型。如果两边都是泛型类型,类型变量不存在继承关系。所以你的下面两个赋值会报错。

评分

参与人数 1黑马币 +5 收起 理由
黄锦成 + 5

查看全部评分

回复 使用道具 举报
泛型的两边应该都是一致的。
ArrayList<String> al3 = new ArrayList<Object>();
ArrayList<Object> al4 = new ArrayList<String>();

参数类型继承不是用在new对象上,而是用在方法上的。
public void method(ArrayList<? extends Object> obj){//这就是一个参数继承的泛型,说明存的是ArrayList参数,ArrayList里面可以装的对象时Object的子类对象
}

评分

参与人数 1黑马币 +5 收起 理由
黄锦成 + 5

查看全部评分

回复 使用道具 举报
泛型的参数化类型不考虑类型参数的继承关系,详情请看张孝祥老师的java高新技术中有关泛型的讲解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马