【发布时间】:2011-06-06 19:54:52
【问题描述】:
虽然在某些情况下此类方法重载可能会变得模棱两可,但为什么编译器不允许在编译时和运行时都没有模棱两可的代码?
例子:
// This fails:
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// This fails, too. Even if there is no position in the argument list,
// where the types are the same.
def foo(a: Int) (b: Int = 42) = a + b
def foo(a: String)(b: String = "Foo") = a + b
// This is OK:
def foo(a: String)(b: Int) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// Even this is OK.
def foo(a: Int)(b: Int) = a + b
def foo(a: Int)(b: String = "Foo") = a + b
val bar = foo(42)_ // This complains obviously ...
这些限制有什么不能放宽一点的原因吗?
特别是当将重载的 Java 代码转换为 Scala 时,默认参数非常重要,并且在用一个 Scala 方法替换大量 Java 方法后发现规范/编译器施加了任意限制并不好。
【问题讨论】:
-
“任意限制” :-)
-
看起来你可以使用类型参数来解决这个问题。编译:
object Test { def a[A](b: Int, c: Int, d: Int = 7): Unit = {}; def a[A](a:String, b: String = ""): Unit = {}; a(2,3,4); a("a");} -
@user1609012:你的把戏对我不起作用。我使用 Scala 2.12.0 和 Scala 2.11.8 进行了尝试。
-
恕我直言,这是 Scala 中最强的痛点之一。每当我尝试提供灵活的 API 时,我经常会遇到这个问题,尤其是在重载伴随对象的 apply() 时。虽然我更喜欢 Scala 而不是 Kotlin,但在 Kotlin 中你可以进行这种重载...
标签: scala methods default overloading