Я играл с базовыми типами данных Scala. Я заметил, что класс scala.Any
определяет метод asInstanceOf[T0]: T0
из здесь API имеет то, что он может "Передавать объект получателя типа T0". Используя этот метод в качестве отправной точки, я хотел исследовать кастинг в Scala. Кроме того, я просмотрел stackoverflow для других вопросов по этой теме, и я придумал this
Имея эту информацию, я написал глупую программу.
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)
}
}
Моя цель - понять, что происходит (и почему) в следующих случаях: 1) литье из любого типа в Int. 2) литье из двойного типа в Int 3) литье из String в Int
-
В первом случае у меня было время выполнения ClasscastException, как показано ниже, когда я запускал программу as-com.att.scala.Casting.entry. Исключение указано ниже:
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)
-
Во втором случае получается следующий результат: int - 123 x - 123 Int x - 123
В этом случае предполагается, что код создает ClasscastException, но это не так. Это мое беспокойство.
- В третьем случае я получаю classcastexception:
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)
В этом примере моя цель - перейти к самым основам кастинга в Scala. Я знаю, что этот пример никоим образом не является примером для реального мира, но я пытался заставить свою голову обернуться вокруг основ.