假设我们有类似的东西:
val x = "foo".charAt(0)
让我们进一步假设,我们不知道方法charAt(0)
的返回类型(当然,在Scala API中描述)。有没有办法,我们可以找到变量x
在定义之后和未明确声明的时候的类型?
更新1: 我最初的问题不够准确:我想知道(出于调试原因)变量的类型。也许有一些编译器选项可以看看Scala的类型推断声明了什么类型的变量?
答案 0 :(得分:7)
假设您在名为Something.scala
的源文件中包含以下内容:
object Something {
val x = "foo".charAt(0)
}
您可以使用-Xprint:typer
编译器标志在编译器typer
阶段之后查看程序:
$ scalac -Xprint:typer Something.scala
[[syntax trees at end of typer]]// Scala source: Something.scala
package <empty> {
final object Something extends java.lang.Object with ScalaObject {
def this(): object Something = {
Something.super.this();
()
};
private[this] val x: Char = "foo".charAt(0);
<stable> <accessor> def x: Char = Something.this.x
}
}
您还可以在REPL中使用:type
:
scala> :type "foo".charAt(0)
Char
scala> :type "foo".charAt _
Int => Char
您的IDE也可能提供更好的方式来获取此信息,正如Luigi Plinge在上面的评论中指出的那样。
答案 1 :(得分:3)
使用此方法解决问题:
x.getClass
答案 2 :(得分:3)
这是Travis第一个替代方案的简单版本:
dcs@dcs-132-CK-NF79:~/tmp$ scala -Xprint:typer -e '"foo".charAt(0)'
[[syntax trees at end of typer]] // scalacmd8174377981814677527.scala
package <empty> {
object Main extends scala.AnyRef {
def <init>(): Main.type = {
Main.super.<init>();
()
};
def main(argv: Array[String]): Unit = {
val args: Array[String] = argv;
{
final class $anon extends scala.AnyRef {
def <init>(): anonymous class $anon = {
$anon.super.<init>();
()
};
"foo".charAt(0)
};
{
new $anon();
()
}
}
}
}
}
答案 3 :(得分:2)
如果您使用的是IntelliJIDEA,要在编辑器中显示“类型信息”操作,请导航至该值,然后按Alt
+ =
进行Windows和Ctrl
+ {{1适用于Mac的+ Shift
:
我在编写代码时觉得非常方便。