Come prova, ho scritto questo codice:Se un Int non può essere nullo, cosa 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)
}
mi aspettavo di ottenere un errore che lo scorso invocazione di f(), dicendo che era ambiguo. Il compilatore accettò, e prodotto questo output:
Int
String
String
Ora sto cercando di indovinare che questo ha a che fare con il fatto che non è un Int AnyRef, quindi l'unica versione di F che lavora per f (null) è f (x: stringa). Ma allora, se un Int non può essere nullo, cosa vuol dire null.asInstanceOf [Int]? Il repl dice che è di tipo Int:
scala> :type null.asInstanceOf[Int]
Int
ma non vedo davvero come funziona. Dopo tutto, se provo a lanciare una stringa in un int, si scatena l'inferno:
scala> "foo".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...
Certo che c'è da aspettarselo - "foo" non può essere trasformato in un int. Ma nessuno dei due può null, quindi perché il casting null su un Int funziona? Presumibilmente il pugilato in qualche forma, ma il tipo è ancora Int, che non può essere nullo ...
Cosa mi manca?
Oh, e come potrei averlo ulteriormente capito da solo, usando il REPL o il scalap o qualche indicatore del compilatore magico o ...? – AmigoNico
Un'altra [domanda] simile (http://stackoverflow.com/q/8285916/617996) ... – PrimosK
Dai un'occhiata a un recente aggiornamento delle specifiche https://github.com/scala/scala-dist/pull/20 e pubblichi https://issues.scala-lang.org/browse/SI-4437, che spiega parte della storia di fondo. È un po 'paragonabile a 'default (T)' in C#, afaik. – soc