简单的问题,希望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);                
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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
      

  2.   

    首先问题1:不是前两个类型确定,后边什么类型都能编译的...必须是跟<类型>有继承关系,或者接口关系才行,如果是不相关的类,那么会提示你改成<Object>,因为所有类都是基于Object..
    跟前两个类型确定一点关系都没有,你被提示给糊弄了
    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对象,这明显是错误的.
      

  3.   

    test1.addAll((Collection<Test1>)Arrays.asList(new cc(),new ff()));这样吧。。
      

  4.   

    类型表达式的问题。
       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
    里面讲的很详细。
      

  5.   

    1. public static <T> List<T> asList(T... a) 这是 java.util.Arrays 类的一个泛型方法,当调用泛型方法时要么给出实际类型来代替 T,如 Arrays.<Test1>asList(new aa(), new bb(), new dd(), new ee()); 这样调用等于调用了 public static List<Test1> asList(Test1... a) 方法。当调用时如果没提供 Arrays.<Test1>asList( 编译器会自动分析出这地方应该加的类名并自动给你加上。
    2. 注意 T 后面的 3 个点儿,这是声明了一个参数个数可变的方法,编译器会将其处理成 public static <T> List<T> asList(T[] a) 而调用的地方会处理成 Arrays.<Test1>asList(new Test1[] {new aa(), new bb(), new dd(), new ee()});
      

  6.   

    第一个问题我明白了,可是第2个问题,我依旧不明白~~ 3楼的朋友说的方法,可惜不行,4楼的朋友,我第四版书,第四章,不是类型、值和变量 这章节,第四章名字应该改掉了。我又试了几此,还是在运行时有问题~~~Collection<Test1> test1 = Arrays.asList(new aa(),new bb());
    //test1.addAll(Arrays.<Test1>asList(new cc()));
    //Collections.addAll(test1,new cc());
    test1.add(new cc());以上方法都不行~~~
      

  7.   

    我明白了,原来问题的关键之所在是因为 Arrays.asList();创建的 List 是不能更改的,但是以这种方式创建的 new ArrayList(Arrays.asList()); 却是可以修改的,真搞不懂这是为什么,干嘛非要外面先套个 new ArrayList()
      

  8.   

    楼主该多看看源码,多看看api文档Arrays.asList()不能修改是因为返回的List,是直接封装了数组,数组不能直接addnew ArrayList(...)是把参数的列表元素都拷贝到了新建的ArrayList对象至于Arrays.asList(new aa(),new bb(),new dd(),new ee());
    可以改成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()});