如果没有给出变量的类型,我如何确定?

时间:2012-07-01 19:34:49

标签: scala types

假设我们有类似的东西:

val x = "foo".charAt(0)

让我们进一步假设,我们不知道方法charAt(0)的返回类型(当然,在Scala API中描述)。有没有办法,我们可以找到变量x在定义之后和未明确声明的时候的类型?

更新1: 我最初的问题不够准确:我想知道(出于调试原因)变量的类型。也许有一些编译器选项可以看看Scala的类型推断声明了什么类型的变量?

4 个答案:

答案 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

enter image description here

我在编写代码时觉得非常方便。