为什么Scala编译器不允许带有默认参数的重载方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

例子:

// 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 ...

提问于
用户回答回答于

未来Scala版本的解决方案可能是将类型名称将非默认参数放入命名模式,例如在本例中:

def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int)   (b: Int = 42) = a + b

它应该是这样的:

def foo$String$default$2 = 42
def foo$Int$default$2 = 42

用户回答回答于

对于重载分辨率与默认参数的相互作用,要获得可读和准确的规格是非常困难的。当然,对于许多个别情况,例如这里介绍的情况,很容易说出会发生什么。但这还不够。我们需要一个能够决定所有可能的角落案例的规范。

扫码关注云+社区