如何根据键的类型投射地图?

时间:2019-05-10 04:17:18

标签: scala

我有一个函数getMap,该函数返回Map[Any, Double],以反映键的类型可以变化。

但是,每个返回的Map的键都将具有相同的类型,具体取决于输入,例如:

val intMap = getMap(someParam)

// the keys of intMap are all of type Int

val stringMap = getMap(someOtherParam)

// the keys of stringMap are all of type String

我想在运行时将每个Map下调。

这是我尝试过的:

val actuallyIntMap = Map[Any, Double](1 -> 1.0)
type keyType = actuallyIntMap.head._1.getClass

val intMap = actuallyIntMap.asInstanceOf[Map[keyType, Double]]

// I expect intMap to be a Map[Int, Double]

结果是以下错误:

error: stable identifier required, but this.intMap.head._1 found.
       type keyType = intMap.head._1.getClass

我想是因为keyType在编译时无法解析...?尽管我可以对第一个值进行模式匹配并以这种方式创建一个Map,但这似乎是一个糟糕的设计(除此之外,还很繁琐)。

假设我无法更改getMap函数,在Scala中有什么方法可以实现?

1 个答案:

答案 0 :(得分:1)

您的假设是正确的;这不起作用,因为intMap的类型在编译时未知。

如果在编译时知道结果类型,则可以执行以下操作:

actuallyIntMap.collect{ case (i: Int, v) => i -> v }

这将返回Map[Int, Double]并丢弃键不是Int的所有条目。