2016-02-14 78 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 ...将使用较少的资源