//: 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那样加不行呢?
// new Light(), new Heavy());
编译器只能识别new Light(), new Heavy()属于Powder,而不是Snow
给new Light(), new Heavy()强制转化成Sonw类型应该就可以。
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>,这样就可以通过编译了。