如下:
import java.util.*;class Snow{}class Powder extends Snow{}
class Crusty extends Snow{}
class Slush extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}public class AsListInference {
public static void main(String[] args){
List<Snow> snow1=Arrays.asList(new Crusty(),new Slush(),new Powder());

//List<Snow> snow2=Arrays.asList(new Light(),new Heavy());
//这句编译错误,提示不能从List<Powder>转换为List<Snow>

List<Snow> snow3=new ArrayList<Snow>();
Collections.addAll(snow3, new Light(),new Heavy());

List<Snow> snow4=Arrays.<Snow>asList(new Light(),new Heavy());
}
}snow1和snow2里的对象不都是从snow中继承过来的吗?应该能够向上转型才对啊,但是为什么snow1能创建而snow2不能创建呢?谁能准确的解释一下Arrays.asList()方法是用的规则?

解决方案 »

  1.   

    强烈不推荐这种写法,
    要不用老版jdk的写法Arrays.asList(new Snow[]{new Light(),new Heavy())})(这个可能就是可变参数的原理吧)
    要不写成Arrays.asList((Snow)new Light(),(Snow)new Heavy());
      

  2.   

    是很奇怪,估计也可以认为是bug,但是这些都是jdk1.5后的新特性,尽量少用
      

  3.   

    无语,本来我在百度回答了你,我还准备留言说:我过一会帮你去csdn上问一问的。结果没想到你已经发了。汗死。
    你去看看我在百度给你的回复吧。里面有我刚才试验的结果哈
      

  4.   

    Arrays.asList(..)的原型是 List<T>  = Arrays.asList<T[]>Arrays.asList(new Light(),new Heavy()); 中自下往上匹配new Light(),new Heavy()的Array类型是Powder[],返回就应该是List<Powder>
    这样的话,根据Generic的规则List<Snow> 和List<Powder>是不一样的,所以报错.如果改成Arrays.asList(new Crusty(),new Heavy()),匹配这两个Object的Array类型就是Snow[],这样就不会报错了.
    个人推荐1楼的用法,Arrays.asList(new Snow[]{new Light(),new Heavy())})