2012-07-30 52 views
21

如何施放此为int,而不是Some(Int)演员选项[任何]为int

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

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

回答

34

你可以做a.get.asInstanceOf[Int]然而它是不安全的。更好的方法是保留类型信息,即使用Option[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 
}) 
+1

忘记铸造的一点点;模式匹配显然是要走的路线 – 2012-07-30 12:54:07

+0

我同意。模式匹配是非常强大和真棒:) – 2012-07-30 15:01:39

12

使用.asInstanceOf方法

a.getOrElse(0).asInstanceOf[Int] 

我必须注意,这是不安全 cast:如果你的选项包含不是int,你会得到runt ime异常。

3

你不能施放它的原因是因为你不应该施放。尽管静态类型化编程语言允许您在一种类型和另一种类型之间手动投射,但我可以给你的最好建议是忘记这个功能。

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

如果你让你蒙上转潜力编译时错误,这是我们 喜欢,因为它很容易解决,成为一个ClassCastException,这是我们 不一样,因为它在运行时发生。如果您需要使用 Scala中的演员表,很可能您使用的是不正确的模式。

+3

或者你正在使用(糟糕的设计)Java库... – ziggystar 2012-07-30 07:36:23

+2

虽然我很欣赏情绪,在现实生活中,事情并不总是像黑与白。我需要这样做,因为它可能是底层第三方API返回的4种类型之一。 – Bob 2012-07-31 05:56:25

+0

这是一个非常弱的机制。你可以用更好的模式完成相同的工作......你为什么不试着解释你想要做什么? – Edmondo1984 2012-07-31 06:14:48