简单的问题,希望2个问题都能得到解答~~~
import java.util.*;
class Test1{}
class aa extends Test1{}
class bb extends Test1{}
class cc extends Test1{}
class dd extends aa{}
class ee extends aa{}
class ff extends aa{}public class Test{
public static void main(String[] args){
//问题1:
Collection<Test1> test1 = Arrays.asList(new aa(),new bb(),new dd(),new ee());
/*Collection<Test1> test1 = Arrays.asList(new aa(),new dd(),new ee());
这么写就是错的,为什呢?我知道Arrays.<Test1>asList这样的写法,我要提出的是,我觉得奇怪的
是Arrays.asList(元素1,元素2,元素3,元素4);元素1和元素2确定其类型,而后面不管是什么类
型的都能编译,但是又找不到理论依据,所以拿出来问一下*/
//问题2:
test1.addAll(Arrays.asList(new cc(),new ff())); //这句话是添加元素,虽然可以编译,但为什么执行的时候会出错?
System.out.println(test1);
}
}
import java.util.*;
class Test1{}
class aa extends Test1{}
class bb extends Test1{}
class cc extends Test1{}
class dd extends aa{}
class ee extends aa{}
class ff extends aa{}public class Test{
public static void main(String[] args){
//问题1:
Collection<Test1> test1 = Arrays.asList(new aa(),new bb(),new dd(),new ee());
/*Collection<Test1> test1 = Arrays.asList(new aa(),new dd(),new ee());
这么写就是错的,为什呢?我知道Arrays.<Test1>asList这样的写法,我要提出的是,我觉得奇怪的
是Arrays.asList(元素1,元素2,元素3,元素4);元素1和元素2确定其类型,而后面不管是什么类
型的都能编译,但是又找不到理论依据,所以拿出来问一下*/
//问题2:
test1.addAll(Arrays.asList(new cc(),new ff())); //这句话是添加元素,虽然可以编译,但为什么执行的时候会出错?
System.out.println(test1);
}
}
解决方案 »
- 高分求解,这是什么意思?
- 关于struts2的配置文件加载路径设置,各位有兴趣进来瞄一下
- 用java如何向sqlServer2000 中存入图像
- 谁知道gmai和hotmaill邮箱的登陆 时候的的url ,在地址栏直接输入帐号密码就能登陆?
- 在一次的小问题
- 求把字符串为UTF-8的转为GBK的代码
- db2服务器用的字符集是utf-8,客户端为windows XP中文版,请问jsp下怎么读取数据表中的中文字符?
- 小数位数的问题
- 我用了urlConnection对象联接某个http的地址,但是有时候页面会连接很慢,有没有什么办法设定timeout之类的东西,谢谢
- 一个中文问题,困扰我好长时间了,请大虾帮帮忙,感激不尽.
- 菜鸟的小问题。。。
- 请问如何实现像QQ好友列表的控件!
楼主【llm0528】截止到2008-08-01 11:30:10的历史汇总数据(不包括此帖):
发帖的总数量:72 发帖的总分数:1600 每贴平均分数:22
回帖的总数量:65 得分贴总数量:1 回帖的得分率:1%
结贴的总数量:72 结贴的总分数:1600
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=llm0528
跟前两个类型确定一点关系都没有,你被提示给糊弄了
Collection<Test1> test1 = Arrays.asList(new bb(),new dd(),new ee());
你这样写呢?就不会出问题了??为什么呢?你的dd,ee类,都是继承于aa()..所以当你Collection<Test1> test1 = Arrays.asList(new aa(),new dd(),new ee()); ,这样写,那么认为你的<类型>应该是aa.所以会提示你修改成aa..
第2个问题:
test1.addAll(Arrays.asList(new cc(),new ff()));
这句话当然报错了,你的test1应该add的类型为Test1类型的对象,这是强制的,因为你声明了<>,所以你必须遵守规则,而Arrays.asList返回的对象是个list对象,这明显是错误的.
Collection<Test1> test1 = Arrays.asList(new aa(),new bb(),new dd(),new ee());
这里因为aa和bb类型不同,编译器向上规约,找到它们的共同父类Test1,最后得到结果类型是java.util.List<Test1>,
所以这句没有问题。
Collection<Test1> test1 = Arrays.asList(new aa(),new dd(),new ee());
这句找到的最上层的类是aa,编译器得到的结果类型是java.util.List<aa>,显然和Collection<Test1>类型不匹配,所以编译错误。 test1.addAll(Arrays.asList(new cc(),new ff()));这句话我感觉是原生类型擦除的问题。
可以参考Java™ Language Specification, Third Edition
第四章Chapter 4. Types, Values, and Variables
里面讲的很详细。
2. 注意 T 后面的 3 个点儿,这是声明了一个参数个数可变的方法,编译器会将其处理成 public static <T> List<T> asList(T[] a) 而调用的地方会处理成 Arrays.<Test1>asList(new Test1[] {new aa(), new bb(), new dd(), new ee()});
//test1.addAll(Arrays.<Test1>asList(new cc()));
//Collections.addAll(test1,new cc());
test1.add(new cc());以上方法都不行~~~
可以改成Arrays.asList((Test1)new aa(),(Test1)new bb(),(Test1)new dd(),(Test1)new ee());
或者1.5以前的做法Arrays.asList(new Test1[]{new aa(),new bb(),new dd(),new ee()});