Scala将原语隐式转换为AnyRef

时间:2012-09-27 17:48:26

标签: scala implicit-conversion

在我写的Scala代码中,我有一个Map[String, AnyRef]。当我尝试使用以下内容初始化Map时,Scala会抱怨它期待Map[String, AnyRef],但值为Map[String, Any]

val myMap: Map[String, AnyRef] =
  Map("foo" -> true, "bar" -> false)

我知道我可以使用以下代码:

val myMap: Map[String, AnyRef] =
  Map("foo" -> true.asInstanceOf[AnyRef], "bar" -> false.asInstanceOf[AnyRef])

我在范围内声明了以下内容:

implicit def booleanToAnyRef(value: Boolean): AnyRef = value.asInstanceOf[AnyRef]

但是编译器仍然抱怨。

编译器是否应该使用隐式方法将原始布尔值转换为AnyRef值?有没有办法,没有(丑陋的)x.asInstanceOf[AnyRef]来转换这些?

3 个答案:

答案 0 :(得分:6)

对于记录,正如其他答案所示,最新的编译器会说:

  

注意:来自scala.Boolean =>的隐式存在java.lang.Boolean,但是   从Object继承的方法呈现不明确。这是为了   避免将任何scala.Boolean转换为any的毯子隐式   AnyRef。您可能希望使用类型归属:x: java.lang.Boolean

最新的编译器将永远是一位朋友,他提供的建议比你过去常常和朋友一起提出更好的建议。

答案 1 :(得分:0)

说你正在使用java的布尔值:

scala> def foo(x: AnyRef) = x.toString
foo: (x: AnyRef)java.lang.String

scala> foo(true: java.lang.Boolean)
res0: java.lang.String = true

或定义以下内容:

scala> implicit def b2B(x: Boolean) = java.lang.Boolean.valueOf(x)
//foo: (x: Boolean)java.lang.Boolean

scala> foo(true)
//res1: java.lang.Boolean = true

对于数字类型(但不是布尔值)有.underlying方法:

scala> 1.underlying
//res2: AnyRef = 1

答案 2 :(得分:0)

你应该避免在一般类型之间进行这种隐式转换(并且编译器建议它)。如果您想使用java.lang.Boolean代替scala.Boolean,可以这样做:

import java.lang.Boolean._
val myMap: Map[String, AnyRef] = Map("foo" -> TRUE, "bar" -> FALSE)