Scala原语到AnyRef的隐式转换

Scala原语到AnyRef的隐式转换,scala,implicit-conversion,Scala,Implicit Conversion,在我正在编写的Scala代码中,我有一个映射[String,AnyRef]。当我尝试使用以下命令初始化映射时,Scala抱怨它需要一个Map[String,AnyRef],但该值是Map[String,Any]: val myMap: Map[String, AnyRef] = Map("foo" -> true, "bar" -> false) 我知道我可以使用以下方法: val myMap: Map[String, AnyRef] = Map("foo" -> t

在我正在编写的Scala代码中,我有一个
映射[String,AnyRef]
。当我尝试使用以下命令初始化映射时,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]
之外,还有什么方法可以转换这些文件吗?

只要说你使用的是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
对于数值类型(但不是布尔型),存在。基础方法:

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

您应该避免在常规类型之间进行此类隐式转换(编译器建议这样做)。如果要使用
java.lang.Boolean
而不是
scala.Boolean
可以这样做:

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

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

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


最新的编译器将永远是一个朋友,他提供的建议比你过去常与之相处并一起陷入麻烦的朋友更好。

你为什么不能使用
Map[String,Any]
?我将它传递给需要Map[String,AnyRef]的旧Java代码(转换后)。因为只有Scala关心它是
Any
还是
AnyRef
(都是
Object
到Java),所以您总是可以将映射本身从
map[String,Any]
map[String,AnyRef]
映射到
map[String,AnyRef]+([t-->(true:Java.lang.Boolean))