我有一个函数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中有什么方法可以实现?
答案 0 :(得分:1)
您的假设是正确的;这不起作用,因为intMap
的类型在编译时未知。
如果在编译时知道结果类型,则可以执行以下操作:
actuallyIntMap.collect{ case (i: Int, v) => i -> v }
这将返回Map[Int, Double]
并丢弃键不是Int
的所有条目。