我在这样的类中有一个代码片段:
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)
}
编译没有问题。