5

在我正在编写的 Scala 代码中,我有一个Map[String, AnyRef]. 当我尝试使用以下方法初始化 Map 时,Scala 抱怨它期待 aMap[String, AnyRef]但值为 a 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]可以让这些转换?

4

3 回答 3

7

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

注意:从 scala.Boolean => java.lang.Boolean 中存在一个隐式,但是从 Object 继承的方法被渲染为模棱两可。这是为了避免将任何 scala.Boolean 转换为任何 AnyRef 的一揽子隐式。您可能希望使用类型归属:x: java.lang.Boolean.

最新的编译器将永远是一个比你曾经和你一起遇到麻烦的朋友提供更好建议的朋友。

于 2012-09-27T20:06:10.223 回答
1

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

import java.lang.Boolean._
val myMap: Map[String, AnyRef] = Map("foo" -> TRUE, "bar" -> FALSE)
于 2012-09-27T18:25:35.623 回答
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
于 2012-09-27T18:22:36.473 回答