Como prueba, he escrito este código:Si un Int no puede ser nulo, ¿qué significa null.asInstanceOf [Int]?
object Ambig extends App {
def f(x:Int ) { println("Int" ) }
def f(x:String) { println("String") }
f(null.asInstanceOf[Int ])
f(null.asInstanceOf[String])
f(null)
}
me esperaba conseguir un error en la última invocación de f(), diciendo que era ambigua. El compilador lo aceptó, y produjo este resultado:
Int
String
String
Ahora supongo que esto tiene que ver con el hecho de que no es un Int AnyRef, por lo que la única versión de f que trabaja para f (nulo) es f (x: String). Pero luego, si un Int no puede ser nulo, ¿qué significa null.asInstanceOf [Int]? El repl dice que es de tipo int:
scala> :type null.asInstanceOf[Int]
Int
pero yo no veo la forma en que funciona. Después de todo, si trato de convertir una cadena a un entero, el infierno se desata:
scala> "foo".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...
Por supuesto que es de esperar - "foo" no se puede convertir en un Int. Pero ninguno de los dos puede anular, entonces, ¿por qué lanzar nulo a un trabajo Int? Presumiblemente boxeo de alguna forma, pero el tipo sigue siendo Int, que no puede ser nulo ...
¿Qué me estoy perdiendo?
Ah, y ¿cómo podría haber llegado a entender esto por mi cuenta, usando REPL o scalap o algún indicador de compilador mágico o ...? – AmigoNico
Otro similar [pregunta] (http://stackoverflow.com/q/8285916/617996) ... – PrimosK
Eche un vistazo a una actualización reciente de las especificaciones https://github.com/scala/scala-dist/pull/20 y emita https://issues.scala-lang.org/browse/SI-4437, que explica algunos de los antecedentes. Es un poco comparable a 'default (T)' en C#, afaik. – soc