scalac -explaintypes: Что означает "<notype> <: X?"имею в виду? - PullRequest
8 голосов
/ 14 августа 2011

Если я запускаю «scalac -explaintypes» и вижу что-то вроде:

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

Что означает строка " <: ThingManager?" значит? </p>

Означает ли это, что «тип не может соответствовать ThingManager»?

1 Ответ

6 голосов
/ 15 августа 2011

-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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...