-explain-types
śledzi wszystkie połączenia do kontroli podtypów. Wcięcie służy do wyświetlania wywołań rekursywnych.
Oto mały przykład:
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
Istnieją trzy poziomy zagnieżdżenia. Pierwsze połączenie polega na sprawdzeniu, czy UniqueConstantType(0) <:< UniqueTypeRef(String)
. LHS jest typem singleton dla literalnej liczby całkowitej. Sprawdzanie jest kontynuowane przez considering podstawowy typ tego singletonu typu UniqueTypeRef(Int) <:< UniqueTypeRef(String)
.
Sprawdzenie zgodności następnie searches za pomocą supertypem z Int
z klasy String
(w base type), a następnie sprawdzenie, czy jest zgodny z String
. Nie ma takiego rodzaju nadrzędnego, dlatego zwracane jest NoType
. Wywołanie rekursywne do <:<
prowadzi do wyjścia <notype> <: java.lang.String
.
sym2.isClass && {
val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType
(base ne tr1) && base <:< tr2
}
NoType
to obiekt zerowy. (Kompilator używa również tego wzorca dla NoSymbol
, NoPosition
).
Pomoże to uwzględnić mały fragment kodu, który uruchamia to wyjście. – retronym