@tailrec为什么这个方法不能用'包含不在尾部位置的递归调用'进行编译?

时间:2017-07-27 18:18:10

标签: scala recursion functional-programming

  @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop(key)
    }
  }

此方法无法编译并抱怨它“包含不在尾部位置的递归调用”。有人可以向我解释发生了什么事吗?此错误消息对我没有意义。

1 个答案:

答案 0 :(得分:10)

如果指定了泛型类型,则编译正常:

import scala.annotation.tailrec

 @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop[V](key)
    }
  }

我认为错误信息在这种情况下会产生误导。

简化版提供了更好的提示:

scala>  @tailrec
     |   private def loop[V](key: String): V = {
     |     loop(key)
     |   }
<console>:14: error: could not optimize @tailrec annotated method loop: it is called recursively with different type arguments
           loop(key)
           ^