我有外部服务,返回AnyRef我想将结果转换为布尔值,如果return不是布尔值,则返回false。
这是一个例子:
object ExternalService {
def sendEvent(s: String) : AnyRef = {
return true }
}
object Caller {
def isValid(s: String): Boolean = {
val value = ExternalService.sendEvent("test")
value match {
// pattern type is incompatible with expected type found Boolean expected AnyRef
case b: Boolean => b
case _ => false
}
}
}
但我得到了
错误:(6,12)隐式转换的结果类型必须更多 特定于AnyRef 返回true;错误:(6,12)类型不匹配; found:需要Boolean(true):AnyRef 返回true;错误:(17,15)模式类型与预期类型不兼容; found:需要布尔值:对象 case b:Boolean => B'/ P>
在这种情况下或一般情况下,如何将AnyRef转换为布尔值?
答案 0 :(得分:2)
您的代码有两个问题:
首先,您尝试从返回true
的方法返回AnyRef
。但是,scala.Boolean
不属于该类型(它继承自AnyVal
)并且编译器不乐意被要求查找到“任何引用类型”的隐式转换。您需要更改方法以返回Any
,或者您需要确保返回“装箱”布尔引用类型 - java.lang.Boolean
- 而不是。
匹配语句也是如此 - 类型AnyRef
的值无法为scala.Boolean
,并且您无法访问模式匹配语句中的大量隐式转换逻辑。同样,如果您使用Any
代替AnyRef
,一切都会有效。
代码的工作版本:
object ExternalService {
def sendEvent(s: String) : Any = {
true
}
}
object Caller {
def isValid(s: String): Boolean = {
val value = ExternalService.sendEvent("test")
value match {
// pattern type is incompatible with expected type found Boolean expected AnyRef
case b : Boolean => b
case _ => false
}
}
}
或者,如果您确实需要sendEvent
的返回类型为AnyRef
:
object ExternalService {
def sendEvent(s: String) : AnyRef = {
Boolean.box(true)
}
}
object Caller {
def isValid(s: String): Boolean = {
val value = ExternalService.sendEvent("test")
value match {
// pattern type is incompatible with expected type found Boolean expected AnyRef
case b : java.lang.Boolean => b
case _ => false
}
}
}
(编译器可以管理匹配语句输出中从java.lang.Boolean
到scala.Boolean
的转换,因此您无需在那里明确地取消装箱。)