1

タイプ のマップがあり、Map[_, Any]( に頼らずに) ネイティブ形式で値を抽出したい.asInstanceOf[_]

このようなもの...

val m: Map[String, Any] = Map("i" -> 1, "s" -> "test")

val i: Option[Int] = m.get("i")
val s: Option[String] = m.get("s")

明らかにそれは失敗します。

私はこのアプローチが好きではありませんが、私はこのようなことができると思っていました...しかし、これでもorAnyの代わりに出てきます。IntString

trait MyType[A] {
  def value: A
}

implicit class MyInt(i: Int) extends MyType[Int] { def value: Int = i }
implicit class MyString(s: String) extends MyType[String] { def value: String = s }

val m: Map[String, MyType[_]] = Map("i" -> 1, "s" -> "test")

val i: Option[Int] = m.get("i").map(_.value)
val s: Option[String] = m.get("s").map(_.value)

それから私は多分いくつかのラッパーを考えましたMap...

case class MyMap(m: Map[String, Any]) {
  def get[A](k: String)(implicit ev: Option[Any] => Option[A]): Option[A] = m.get(k)
}

しかし、それはまだとして出てきAnyます。Any => native に変換する方法がわかりません。

だから私の質問は...

  1. なぜこれが失敗するのですか?
  2. ネイティブ形式で値を取得するためのより良い方法は何ですか? 最も単純で、かつ/または外部依存関係がないことが理想的です...しかし、私は正直に何に対してもオープンです(ただし、今のところまだscala 2.11を使用していることに注意してください)。

ありがとう!

4

1 に答える 1