我是scala和IntelliJ的新手,所以这听起来像一个愚蠢的问题。但是,我看到在调试时,IntelliJ会将参数类型推断为某种“怪异”类型,在我的情况下为MapLike$MappedValues
。预期的类型为Map[String, Iterable[Person]]
。
为什么IntelliJ无法显示正确的类型?现在这对我来说很重要,因为通过调试,我试图找出正确的参数类型,因为这部分的API文档并不十分清楚(使用Apache Flink CEP)
代码示例:
val result:DataStream[String] = patternStream.select(patterns => {
val person:Person = patterns.head._2.head
s"Person ${person.name} of age ${person.age} can drink!"
})
根据documentation:
“ select()方法将选择函数作为参数,每个匹配事件序列都将调用该函数。它将接收Map [String,Iterable [IN]]形式的匹配”
为什么IntelliJ显示MapLike$MappedValues
而不显示Map[String,Iterable[Person]]
呢?
答案 0 :(得分:1)
调试器向您显示运行时类。
在JVM上,泛型类型参数在运行时被“擦除”,因此它们在调试器中不可见。 Map
只是一个接口,但是MapLike$MappedValues
将其实现为AbstractMap
的继承者。
因此,显示的 class 与值的 type 兼容。
要查找表达式的编译时类型,IntelliJ可以帮助您: