scala - Scala - Map[Class[T], Seq[T]] - 键和值中的泛型
问题描述
我想创建一个包含对(类->键类对象的序列)的映射。下面的示例显然失败了,但它应该详细描述我需要什么。我会很高兴你的帮助:)
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)
}
}
解决方案
AMap
本身无法做到这一点;但是您可以创建一个包装类。就像是
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)
}
}
注意那里需要一些演员表。
适应口味(例如,使用ClassTag
s 避免手动传递类,如果需要,使其不可变等)
推荐阅读
- c# - Entityframework > 按键获取跟踪的实体(不同的参考)
- android-studio - 如何在 android studio arctic fox 中增加 RAM 分配的内存?
- java - Docker中的SpringBoot + Postgres:在docker-compose上:无法初始化JPA EntityManagerFactory:无法加载类
- java - 如何在 Netbeans 的 Maven 项目中将图像添加到 JFrame?
- ansible - 从寄存器 stdout_lines 输出中创建修改列表
- google-cloud-platform - Google Cloud Logging 中缺少 Cloud Run 服务
- python - 如何从字典中获取特定值
- python - python:为什么它不打印
- java - 从不同片段调用片段函数时出现 NullPointerException
- apache-spark - 如何在 Spark-YARN 上设置每个任务的最大允许执行时间?