在IntelliJ调试器(标量)中更正类名

时间:2018-10-29 08:43:04

标签: scala class debugging intellij-idea

我是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!"
})

这是我在调试器中看到的:enter image description here

根据documentation
“ select()方法将选择函数作为参数,每个匹配事件序列都将调用该函数。它将接收Map [String,Iterable [IN]]形式的匹配”

为什么IntelliJ显示MapLike$MappedValues而不显示Map[String,Iterable[Person]]呢?

1 个答案:

答案 0 :(得分:1)

调试器向您显示运行时类。

在JVM上,泛型类型参数在运行时被“擦除”,因此它们在调试器中不可见。 Map只是一个接口,但是MapLike$MappedValues将其实现为AbstractMap的继承者。

因此,显示的 class 与值的 type 兼容。

要查找表达式的编译时类型,IntelliJ可以帮助您:

  • 选择表达式
  • 按下“类型信息”热键(通常是shift + ctrl + p)