5

私が書いている Scala コードには、Map[String, AnyRef]. 以下を使用して Map を初期化しようとすると、Scala は a を期待しているMap[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 に答える