2016-02-14 83 views
0

試圖將可選/可空的java布爾值讀入scala布爾值。將可空的java布爾轉換爲scala時出錯布爾值

val nullableJavaBool: java.lang.Boolean = java.lang.Boolean.TRUE 
val x: scala.Boolean = Option(nullableJavaBool).getOrElse(java.lang.Boolean.FALSE) 
val y: scala.Boolean = Option(nullableJavaBool).getOrElse(false) 

[scalac-2.11] /myworkspace/MyClass.scala:43: error: type mismatch; [scalac-2.11] found : Any [scalac-2.11] required: Boolean [scalac-2.11] val x: scala.Boolean = Option(nullableJavaBool).getOrElse(java.lang.Boolean.FALSE) [scalac-2.11]
^[scalac-2.11]

/myworkspace/MyClass.scala:43: error: type mismatch; [scalac-2.11] found : Any [scalac-2.11] required: Boolean [scalac-2.11] val y: scala.Boolean = Option(nullableJavaBool).getOrElse(false)

能否請您解釋一下這個錯誤背後的原因,什麼是更好的方式來實現這一目標:

我同時使用以下方法得到錯誤?

+0

@STaefi,沒有貌似不同的問題。 – vitalii

回答

2

問題出在scala使用的類型推理器中。問題在於,類型推理器有時無法推斷像Option [T]這樣的更高類型的超類型,儘管它對用戶來說很明顯。 它不與布爾儘可能使用選項儘可能多的問題,可以考慮這個答案的完整問題的解釋:

Option getOrElse type mismatch error

要糾正你的代碼,就必須用手把一些類型:

val nullableJavaBool: java.lang.Boolean = java.lang.Boolean.TRUE 
val x:scala.Boolean = (Option(nullableJavaBool).getOrElse[java.lang.Boolean](java.lang.Boolean.FALSE)) 

BTW您的轉換布爾值的方法是確定的,雖然簡單if b == null then ... else ...將使用較少的資源