scalac -explaintypes:"<notype> <:X?" 意思?

Seb*_*iot 8 scala

如果我运行"scalac -explaintypes"并看到类似的内容:

Nothing <: ThingManager?
  <notype> <: ThingManager?
  false
true
Run Code Online (Sandbox Code Playgroud)

行"<notype> <:ThingManager?"是什么?意思?

这是否意味着"没有类型可能符合ThingManager"?

ret*_*nym 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
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).