【问题标题】:Scala - Map[Class[T], Seq[T]] - generics in key and valuesScala - Map[Class[T], Seq[T]] - 键和值中的泛型
【发布时间】:2021-08-08 02:47:04
【问题描述】:

我想创建一个包含对(类 -> 键类对象的序列)的 Map。下面的示例显然失败了,但它应该详细描述我需要什么。我会很高兴你的帮助:)

object TestMain {
  def main(args: Array[String]): Unit = {
    val someMap: Map[Class[_], Seq[_]] = Map( //how to write this type correctly?
        classOf[String] -> Seq("A", "B"),
        classOf[Int] -> Seq(1, 2),
      )
    val typedValue: Seq[String] = someMap(classOf[String])//I want here type Seq[String] not Seq[_]
    println(typedValue)
  }
}

【问题讨论】:

  • Map 的值是在运行时还是在编译时填充的?如果是后者,那么 typeclass 可能会更好。

标签: scala generics


【解决方案1】:

Map 本身无法做到这一点;但是您可以创建一个包装类。类似的东西

class ClassSeqPair[T](val cls: Class[T], val value: Seq[T])

class ClassSeqPairs {
  private var map = Map[Class[_], Seq[_]]

  def put[T](cls: Class[T], value: Seq[T]) = {
    map += (cls, value)

  def apply[T](cls: Class[T]): Seq[T] = map(cls).asInstanceOf[Seq[T]]
}

object ClassSeqPairs {
  def apply(pairs: ClassSeqPair[_]*): ClassSeqPairs = {
    val result = new ClassSeqPairs
    for (pair in pairs) {
      result.put(pair.cls, pair.value)
    }
    result
  }
}

用途:

object TestMain {
  def main(args: Array[String]): Unit = {
    val someMap: ClassSeqPairs = ClassSeqPairs(
        ClassSeqPair(classOf[String], Seq("A", "B")),
        ClassSeqPair(classOf[Int], Seq(1, 2)),
      )
    val typedValue: Seq[String] = someMap(classOf[String])
    println(typedValue)
  }
}

注意那里需要一些演员表。

适应口味(例如,使用ClassTags 避免手动传递类,如果需要,使其不可变等)

【讨论】:

  • 是的,我以前做过类似的事情,但我认为它可以做得更好。 Scala中是否有一些内置类可以重用而不是制作自己的包装器?在这种情况下,我什至现在都不知道如何为谷歌撰写问题。
  • 我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多