2011-08-14 45 views

回答

6

-explain-types跟蹤所有調用子類型檢查。縮進用於顯示遞歸調用。

這裏有一個小例子:

scala210 -explaintypes -e '0 : java.lang.String' 
scalacmd9062993631372828655.scala:1: error: type mismatch; 
found : Int(0) 
required: java.lang.String 
0 : java.lang.String 
^ 
one error found 
Int(0) <: java.lang.String? 
    Int <: java.lang.String? 
    <notype> <: java.lang.String? 
    false 
    false 
false 

有三個層次遞歸。第一個電話是檢查UniqueConstantType(0) <:< UniqueTypeRef(String)。 LHS是字面整數的單身類型。檢查繼續considering該單體類型的基礎類型UniqueTypeRef(Int) <:< UniqueTypeRef(String)

一致性檢查然後searches爲的類String(所述base type)的Int的超類型,然後檢查是否這符合String。沒有這樣的超類型,所以NoType被返回。遞歸調用<:<導致輸出<notype> <: java.lang.String

sym2.isClass && { 
    val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType 
    (base ne tr1) && base <:< tr2 
} 

NoType是一個空對象。 (編譯器也使用此模式爲NoSymbolNoPosition)。

+0

非常豐富,謝謝。 –