2012-07-30 51 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