scala – 为什么抛出堆栈溢出异常?

前端之家收集整理的这篇文章主要介绍了scala – 为什么抛出堆栈溢出异常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
……尽管它可以通过尾部调用进行优化?

def areStreamsEqual(stream1: InputStream,stream2: InputStream): Boolean =
{
    val one = stream1.read()
    val two = stream2.read()
    if(one != two)
        false
    else if(one == -1 && two == -1)
        true
    else
        areStreamsEqual(stream1,stream2)
}

反正是否强制Scala编译器在这里进行尾调用优化?

解决方法

感谢pst关于@tailrec的评论.鉴于注释scala编译器错误消息解释了不优化方法的原因.

<filename>.scala:64: error: could not optimize @tailrec annotated method: it is neither private nor final so can be overridden
def areStreamsEqual(stream1: InputStream,stream2: InputStream): Boolean =

使方法私有排序

我怀疑在字节码级别上,有两个调用方法的指令:virtual_call和tail_call.

猜你在找的Scala相关文章