“递归值需要类型”,没有涉及递归或前向引用

时间:2016-06-28 09:00:55

标签: scala

我在这样的类中有一个代码片段:

protected val reservedWords =
  this.getClass.getMethods
    .filter(_.getReturnType == classOf[Keyword])
    .map(_.invoke(this).asInstanceOf[Keyword].str)

override val lexical = {
  new SqlLexical(reservedWords)
}

这很好用,但reservedWords只使用过一次。所以我决定把它变成一个局部变量:

override val lexical = {
  val keywords =
    this.getClass.getMethods
      .filter(_.getReturnType == classOf[Keyword])
      .map(_.invoke(this).asInstanceOf[Keyword].str)

  new SqlLexical(keywords)
}

SqlLexical的构造函数需要Seq[Int])。不知怎的,这给出了两个错误:

[error] /home/aromanov/IdeaProjects/scalan-lite/meta/src/main/scala/scalan/meta/SqlParser.scala:186: recursive value keywords needs type
[error]       val keywords =
[error]           ^
[error] /home/aromanov/IdeaProjects/scalan-lite/meta/src/main/scala/scalan/meta/SqlParser.scala:191: not found: value keywords
[error]       new SqlLexical(keywords)
[error]                      ^

替换val keywords = Nil会使两个错误都消失。提供显式类型仅修复第一个错误。这是怎么回事?

我还没有最小化的例子,因为我希望我遗漏了一些明显的东西而且不需要它。但是可以在https://github.com/scalan/scalan/blob/a84253df1b04bf98ab7aba43be9e661f5c9e1423/meta/src/main/scala/scalan/meta/SqlParser.scala看到完整的类,并且应该可以通过

重现问题
git clone https://github.com/scalan/scalan.git
git checkout a84253df1b04bf98ab7aba43be9e661f5c9e1423
sbt scalan-meta/compile

更新:如果我保留原始protected val reservedWords

override val lexical = {
  val keywords =
    this.getClass.getMethods
      .filter(_.getReturnType == classOf[Keyword])
      .map(_.invoke(this).asInstanceOf[Keyword].str)

  new SqlLexical(keywords)
}

编译没有问题。

0 个答案:

没有答案