模式匹配铸造

时间:2018-04-20 07:33:51

标签: scala

我有外部服务,返回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转换为布尔值?

1 个答案:

答案 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.Booleanscala.Boolean的转换,因此您无需在那里明确地取消装箱。)