Java編程思想學習筆記(一)

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以上版本應該是不會出現這種情形的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章