【问题标题】:Overloading with optional parameters causes infinite recursion使用可选参数重载会导致无限递归
【发布时间】:2013-12-30 17:02:10
【问题描述】:
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)

}

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

【问题讨论】:

  • 当你传递三个 Int 时它如何知道调用哪一个?它会选择更正确的那个吗?

标签: scala recursion overloading


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    我也会给他们两个 alpha 参数。

    【讨论】:

    • 我最终复制了 new Color(...) 并将 alpha 参数替换为两者的重载。接受另一个答案,因为它回答了我的问题并指出了规范与我的情况的相关性。
    • 当然 :) 我直接解决了“有没有办法解决这个问题?”部分
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2014-01-10
    • 1970-01-01
    • 2018-07-08
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多