使用可选参数进行重载会导致无限递归

时间:2013-12-30 17:02:11

标签: scala recursion overloading

object Color {
    def apply(r: Int, g: Int, b: Int, a: Int = 255): Color =
        new Color(r, g, b, a)

    def apply(r: Float, g: Float, b: Float): Color =
        Color((r * 255).toInt, (g * 255).toInt, (b * 255).toInt)

}

在我看来,第二个申请应该执行第一个。但是,它会自行执行。如果我要删除可选参数,它可以工作。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

最简单的方法是直接从第二个new Color(...)方法调用apply

我也给他们一个alpha参数。

答案 1 :(得分:2)

如果我正确阅读规范,那么在重载解析(6.26.3)中不会考虑需要使用默认参数的替代方案:

  

否则,让C为一组不适用的替代方案   将应用程序中的任何默认参数应用于e1,...,em。

因此,您可以通过传递alpha显式调用4参数apply方法,或直接调用Color构造函数。

实际上这也意味着在传递3个参数时永远不会调用Int重载,这使得默认参数几乎没用。