2011-08-14 10 views

Odpowiedz

6

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

+0

Bardzo pouczające, dzięki. –