Scala 将任何字符串强制转换为Int

Scala 将任何字符串强制转换为Int,scala,Scala,我有一个类型为Any的变量,运行时类型为String,我想将其转换为Int: val a: Any = "123" val a: Any = "123" val b = a.asInstanceOf[String].toInt 如果我尝试转换为Int,我将得到一个异常java.lang.ClassCastException: val b = a.asInstanceOf[Int] 那么我该怎么做呢?强制转换不会转换您的类型,它只是告诉系统您认为您足够聪明,能够知道对象的正确类型。例如: t

我有一个类型为
Any
的变量,运行时类型为
String
,我想将其转换为
Int

val a: Any = "123"
val a: Any = "123"
val b = a.asInstanceOf[String].toInt
如果我尝试转换为Int,我将得到一个异常
java.lang.ClassCastException

val b = a.asInstanceOf[Int]
那么我该怎么做呢?

强制转换不会转换您的类型,它只是告诉系统您认为您足够聪明,能够知道对象的正确类型。例如:

trait Foo
case class Bar(i: Int) extends Foo

val f: Foo = Bar(33)
val b = f.asInstanceOf[Bar]  // phew, it works, it is indeed a Bar
您可能正在寻找的是将
字符串
转换为
Int

val a: Any = "123"
val a: Any = "123"
val b = a.asInstanceOf[String].toInt
或者,由于可以对任何对象调用
toString

val b = a.toString.toInt
如果字符串不是有效数字,您仍然可以获得运行时异常,例如

"foo".toInt  // boom!

通常,您会避开类强制转换,并在Scala中嵌套
try catch

import scala.util.{ Try, Failure, Success };

val x: Any = 5;
val myInt = Try { x.toString.toInt) } getOrElse { 0 // or whatever}; // this is defaulting
val mySecondInt = Try { x.toString.toInt };
mySecondInt match {
   case Success(theactualInt) => // do stuff
   case Failure(e) => // log the exception etc.
}

在Java中,its
Integer.toString
。。。你也应该能够从scala中使用它。嗯,
a.asInstanceOf[String].toInt
这是一个双重转换,我想避免它。
toInt
不是一个转换。这是一种转换方法,基本上可以追溯到
java.lang.Integer.parseInt
强制转换和转换之间的区别是什么?强制转换意味着你告诉虚拟机你认为你知道一个值
x
必须是给定类型的
a
。在强制转换之后,您可以在
x
上调用
A
的接口(方法)。它不会以任何方式改变
x
,它只会在运行时验证它确实是
A
(否则会抛出
ClassCastException
)。转换采用类型为
A
的值,并生成类型为
B
的完全独立的新值。转换是在编译时检查的常规方法调用。我通常应该使用哪种转换,哪种转换更便宜(更快)?