27

我如何将其转换为 Int 而不是Some(Int)

val a: Option[Any] = Some(1)

我试过toInt了,它给出了一个错误value toInt is not a member of Option[Any]

4

3 回答 3

40

你可以这样做,a.get.asInstanceOf[Int]但它是不安全的。更好的方法是保留类型信息,即使用 aOption[Int]而不是Option[Any]. 那么你就不需要用asInstanceOf.

val a:Option[Int] = Some(1)
val i = a.get

直接使用get是不安全的,因为如果OptionNone,则会引发异常。所以使用getOrElse更安全。或者您可以使用模式匹配a来获取值。

val a:Option[Any] = Some(1) // Note using Any here
val i = (a match {
  case Some(x:Int) => x // this extracts the value in a as an Int
  case _ => Int.MinValue
})
于 2012-07-30T06:10:06.070 回答
15

使用.asInstanceOf方法

a.getOrElse(0).asInstanceOf[Int]

我必须注意这是不安全的强制转换:如果您的 Option 不包含 Int,您将获得运行时异常。

于 2012-07-30T06:06:39.220 回答
3

你不能施放它的原因是因为你不应该施放。虽然静态类型编程语言允许您在一种类型和另一种类型之间手动转换,但我能给您的最好建议是忘记这些特性。

特别是,如果您想充分利用每种编程语言,请尝试创建合适的用户,如果一种语言不适合您想要的用途,只需选择另一种(例如动态类型的语言):

如果您进行强制转换,您会将潜在的编译时错误(我们喜欢因为它很容易解决)转变为 ClassCastException,而我们不喜欢它,因为它发生在运行时。如果您需要在 Scala 中使用强制转换,很可能您使用了不正确的模式。

于 2012-07-30T06:53:23.500 回答