-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
).
Ayudaría incluir un pequeño fragmento de código que active esta salida. – retronym