2011-08-14 25 views

Respuesta

6

-explain-types hace un seguimiento de todas las llamadas para verificar los subtipos. La sangría se usa para mostrar llamadas recursivas.

Aquí hay un pequeño ejemplo:

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 

Hay tres niveles de recursividad. La primera llamada es verificar si UniqueConstantType(0) <:< UniqueTypeRef(String). El LHS es un tipo de singleton para el entero literal. La verificación continúa por considering el tipo subyacente de ese singleton tipo UniqueTypeRef(Int) <:< UniqueTypeRef(String).

La verificación de la conformidad a continuación searches para el un supertipo de Int de la clase String (la base type) y, a continuación, comprobar si este se ajusta a String. No existe dicho supertipo, por lo que se devuelve NoType. La llamada recursiva a <:< lleva a la salida <notype> <: java.lang.String.

sym2.isClass && { 
    val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType 
    (base ne tr1) && base <:< tr2 
} 

NoType es un objeto nulo. (El compilador también usa este patrón para NoSymbol, NoPosition).

+0

Muy informativo, gracias. –