如果我运行“scalac -explaintypes”并看到类似的内容:
Nothing <: ThingManager?
<notype> <: ThingManager?
false
true
“&lt; notype&gt;&lt;:ThingManager?”这一行是什么?意思?
这是否意味着“没有类型可能符合ThingManager”?
答案 0 :(得分: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)
的基础类型。
然后对Int
类String
的超类型searches进行一致性检查base type,然后检查这是否符合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
)。