17

さまざまなタイプの値 (Double、String、Int など) を入れる Map が必要です。キーは String にすることができます。

これを行う方法はありますかmap.apply(k)?

val map: Map[String, SomeType] = Map()
val d: Double = map.apply("double")
val str: String = map.apply("string")

私はすでにジェネリック型で試しました

class Container[T](element: T) {
    def get: T = element
}

val d: Container[Double] = new Container(4.0)
val str: Container[String] = new Container("string")
val m: Map[String, Container] = Map("double" -> d, "string" -> str)

Containerしかし、パラメータを取るので不可能です。これに対する解決策はありますか?

4

7 に答える 7

17

これは、shapelessで非常に簡単になりました。

scala> import shapeless._ ; import syntax.singleton._ ; import record._
import shapeless._
import syntax.singleton._
import record._

scala> val map = ("double" ->> 4.0) :: ("string" ->> "foo") :: HNil
map: ... <complex type elided> ... = 4.0 :: foo :: HNil

scala> map("double")
res0: Double with shapeless.record.KeyTag[String("double")] = 4.0

scala> map("string")
res1: String with shapeless.record.KeyTag[String("string")] = foo

scala> map("double")+1.0
res2: Double = 5.0

scala> val map2 = map.updateWith("double")(_+1.0)
map2: ... <complex type elided> ... = 5.0 :: foo :: HNil

scala> map2("double")
res3: Double = 5.0

これは、この回答の日付の時点で形状のない 2.0.0-SNAPSHOT にあります。

于 2013-08-17T10:40:15.990 に答える
4

私はついに自分の解決策を見つけました。これは私の場合に最も効果的でした:

case class Container[+T](element: T) {
    def get[T]: T = {
        element.asInstanceOf[T]
    }
}

val map: Map[String, Container[Any]] = Map("a" -> Container[Double](4.0), "b" -> Container[String]("test"))
val double: Double = map.apply("a").get[Double]
val string: String = map.apply("b").get[String]
于 2013-07-17T17:01:26.080 に答える