jak prawidłowo używać asInstanceOf w Scali
Gram z podstawowymi typami danych Scala. Zauważyłem, żescala.Any
klasa definiuje metodęasInstanceOf[T0]: T0
ztutaj API ma to, że może „Rzucić obiekt odbiornika na typ T0”. Używając tej metody jako punktu wyjścia, chciałem zbadać casting w Scali. Sprawdziłem także stackoverflow dla innych pytań na ten temat i wymyśliłemto Dzięki tym informacjom napisałem głupi program.
package com.att.scala
import com.att.scala.Sheltie
object Casting {
//def foo(x: String){
def foo(x: Int) {
println("x is " + x)
//if(x.isInstanceOf[String])
if(x.isInstanceOf[Int])
println("Int x is " + x)
//println("String x is " + x)
}
def entry() {
//val double: Any = 123.123
val double: Double = 123.23
val int = double.asInstanceOf[Int] //exception expected here
//val str: String = "123"
foo(int)
}
}
Moim celem jest zrozumienie, co się dzieje (i dlaczego) w następujących przypadkach: 1) rzucanie z dowolnego typu na Int. 2) rzucanie z typu Double na Int 3) rzutowanie z String na Int
W pierwszym przypadku dostałem wyjątek ClasscastException, jak poniżej, kiedy uruchomiłem program jako - com.att.scala.Casting.entry. Wyjątek przedstawiono poniżej:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source) at com.att.scala.Casting$.entry(Casting.scala:17)
W drugim przypadku otrzymuję następujący wynik: int to 123 x to 123 Int x to 123
W tym przypadku kod powinien wywołać wyjątek ClasscastException, ale tak nie jest. To jest mój niepokój.
W trzecim przypadku otrzymuję wyjątek classcast:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source) at com.att.scala.Casting$.entry(Casting.scala:20)
W tym przykładzie moim celem jest dotarcie do podstaw castingu w Scali. Wiem, że ten przykład w żadnym wypadku nie jest prawdziwym przykładem świata, ale starałem się owinąć głowę wokół podstaw.