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中只有Power類型,因此它會創建List< Power >而不是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中只有Power類型,因此它會創建List< Power >而不是List < Snow >。
因此,這幾句話描述的情形存在於舊版本的Jdk中,經測試Jdk7同樣會出現這種報錯,但是Jdk8以上版本應該是不會出現這種情形的。