在我写的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]
来转换这些?
答案 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)