Java编程思想中文版第四版,第221页持有对象章节有几段话,让我一直懵逼,现在解决了,所以记录一下
//: 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());
// Won't compile:
// List<Snow> snow2 = Arrays.asList(
// new Light(), new Heavy());
// Compiler says:
// found : java.util.List<Powder>
// required: java.util.List<Snow>
} ///:~
当试图创建snow2时,Arrays.asList中只有Powder类型,因此它会创建List< Powder >而不是List < Snow >。
这句话一直让我搞不懂,因为我这段代码编译和执行时完全正常的,如下:
后来我猜测是Jdk版本的问题,这本书是基于Java SE5/6,而我使用的是Jdk 8,所以我安装了Jdk5和Jdk6,分别创建了项目测试这段代码,果然出现了问题,如下:
控制台报错如下:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from List<Powder> to List<Snow>
at AsListInference.main(AsListInference.java:32)
显然,当试图创建snow2时,Arrays.asList中只有Powder类型,因此它会创建List< Powder >而不是List < Snow >。
因此,这几句话描述的情形存在于旧版本的Jdk中,经测试Jdk7同样会出现这种报错,但是Jdk8以上版本应该是不会出现这种情形的。