scalac -explaintypes:“<notype>&lt;:X?”意思?</NoType在>

时间:2011-08-14 09:52:59

标签: scala

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

Nothing <: ThingManager?
  <notype> <: ThingManager?
  false
true

“&lt; notype&gt;&lt;:ThingManager?”这一行是什么?意思?

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

1 个答案:

答案 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)的基础类型。

然后对IntString的超类型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是一个空对象。 (编译器还将此模式用于NoSymbolNoPosition)。