-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 - это одноэлементный тип для буквального целого числа. Проверка продолжается на с учетом базового типа этого одноэлементного типа 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
}
NoType
является нулевым объектом. (Компилятор также использует этот шаблон для NoSymbol
, NoPosition
).