如果我運行 「scalac -explaintypes」,看到這樣的:scalac -explaintypes:什麼是「<notype><:X?」意思?
Nothing <: ThingManager?
<notype> <: ThingManager?
false
true
什麼行 「< NoType在> <:ThingManager」意思?
是否意味着「沒有類型可能符合ThingManager」?
如果我運行 「scalac -explaintypes」,看到這樣的:scalac -explaintypes:什麼是「<notype><:X?」意思?
Nothing <: ThingManager?
<notype> <: ThingManager?
false
true
什麼行 「< NoType在> <:ThingManager」意思?
是否意味着「沒有類型可能符合ThingManager」?
-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
是一個空對象。 (編譯器也使用此模式爲NoSymbol
,NoPosition
)。
非常豐富,謝謝。 –
這將有助於包含觸發此輸出的一小段代碼。 – retronym