如果我运行"scalac -explaintypes"并看到类似的内容:
Nothing <: ThingManager?
<notype> <: ThingManager?
false
true
Run Code Online (Sandbox Code Playgroud)
行"<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
Run Code Online (Sandbox Code Playgroud)
递归有三个级别.第一个电话是检查是否UniqueConstantType(0) <:< UniqueTypeRef(String).LHS是字面整数的单例类型.通过考虑该单例类型的基础类型继续检查UniqueTypeRef(Int) <:< UniqueTypeRef(String).
然后,一致性检查将搜索Int类的超类型String(基类型),然后检查是否符合String.没有这样的超类型,所以NoType返回.递归调用<:<导致输出<notype> <: java.lang.String.
sym2.isClass && {
val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType
(base ne tr1) && base <:< tr2
}
Run Code Online (Sandbox Code Playgroud)
NoType是一个空对象.(编译器也使用此模式NoSymbol,NoPosition).
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |