//: holding/AsListInference.java
// Arrays.asList() makes its best guess about type.
import java.util.*;class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
class Crusty extends Snow {}
class Slush extends Snow {}public class AsListInference {
  public static void main(String[] args) {
    List<Snow> snow1 = Arrays.asList(
      new Crusty(), new Slush(), new Powder(), new Light());    // Won't compile:
    // List<Snow> snow2 = Arrays.asList(
    //   new Light(), new Heavy());
    // Compiler says:
    // found   : java.util.List<Powder>
    // required: java.util.List<Snow>    // Collections.addAll() doesn't get confused:
    List<Snow> snow3 = new ArrayList<Snow>();
    Collections.addAll(snow3, new Light(), new Heavy());    // Give a hint using an
    // explicit type argument specification:
    List<Snow> snow4 = Arrays.<Snow>asList(
       new Light(), new Heavy());
  }
} ///:~
为什么snow2那样加不行呢?

解决方案 »

  1.   

    Arrays.asList()返回的是List,不是ArrayList
      

  2.   

    // List<Snow> snow2 = Arrays.asList(
        //   new Light(), new Heavy());
    编译器只能识别new Light(), new Heavy()属于Powder,而不是Snow
    给new Light(), new Heavy()强制转化成Sonw类型应该就可以。
      

  3.   

    如果不给asList指定结果的类型(就像snow4那样),asList会把参数中最大的那个类型(就是能涵盖所有参数的类型)做为结果的类型。
    List<Snow> snow2 = Arrays.asList( new Light(), new Heavy());这句中new Light()和new Heavy()两个参数,最大的类型是Powder,所以返加一个List<Powder>.你如果再加一个非Powder的参数,比如,new Slush().成为:
    List<Snow> snow2 = Arrays.asList( new Light(), new Heavy(),new Slush());三个参数只能统一为Snow类,所以最大的类型是Snow,所以返回为List<Snow>,这样就可以通过编译了。
      

  4.   

    Thinking in Java上的源代码,仔细看哈书,应该就会了哦
      

  5.   

    Powder extends Snow,是不是设计的时候有点扭曲?为什么只能Powder,或者还要加其它子类!
      

  6.   

    Arrays.asList()方法确实能生成一个List,它基于一个固定大小的数组,仅支持那些不会改变数组大小的操作,也就是说不能修改底层数据结构的尺寸。