2017-08-13 88 views
2

我有以下代碼:isInstanceOf與路徑依賴型工作

class Outer { 
    class Inner 
} 

val outer1 = new Outer 
val outer2 = new Outer 
val a1 = new outer1.Inner 
val a2 = new outer2.Inner 

val a2: outer2.Inner = a1 
println(a1.isInstanceOf[outer2.Inner]) 

我知道val a2: outer2.Inner = a1已編譯因爲路徑依賴型的錯誤,但我不明白爲什麼println(a1.isInstanceOf[outer2.Inner])將打印true

+0

這是因爲a1和a2都指向Outer.Inner類的相同位置。 –

回答

3

因爲outer1.Innerouter2.Inner具有相同的擦除,在斯卡拉編寫爲Outer#InnerisInstanceOf只適用於輸入擦除,除非特定情況下的指定不同(因爲它適用於複合類型)。

這與List("a", "b").isInstanceOf[List[Int]]是正確的:不相信isInstanceOf,除非您瞭解類型擦除的工作原理!