2015-10-17 104 views
4

這是思維在Java中這段代碼爲什麼沒有類型轉換異常?

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) { 
     //The book says it won't compile, but actually it does. 
     List<Snow> snow2 = Arrays.asList(new Light(), new Heavy()); 
    } 
} 

這裏是我的Java環境:

  1. Java版本 「1.8.0_60」
  2. 的Java(TM)SE運行時環境(建1.8。 0_60-b27)
  3. Java HotSpot(TM)64位服務器虛擬機(版本25.60-b23,混合模式)
+3

因爲不應該有一個。 'Light'和'Heavy'是Snow的子類,因此可以添加到'Snow'的List中。 – hotzst

+1

在Java 7中,此代碼給我一個編譯錯誤 - '類型不匹配:無法從列表轉換爲列表'。 – Eran

回答

6

其實這本書是對的。這裏的區別是Java版本。

Thinking in Java針對Java 5/6(根據封面)。對於這個版本的Java(也包括Java 7),該代碼段將不會與javac一起編譯。錯誤是:

不兼容的類型:java.util.List<Powder>不能轉換到java.util.List<Snow>

在Java 8所示,該編譯就好:類型推測系統進行了改進。

2

這本書顯然希望編譯器確定右邊的類型爲List<Powder>,它不是List<Snow>。但是,由於Arrays.<T>asList(T ...)對於T有其自己的範圍,因此編譯器能夠推斷出正確的邊界應該是Snow並且LightHeavy都是Snow

我手邊沒有Java 7編譯器,但是Java 8在generic type inference中確實帶來了一些改進,這可能是編譯器解決這個特定類型綁定的問題。

相關問題