我编写了一个类,该类接受varargs作为参数,并指定其默认值,以便用户经常可以在不指定参数的情况下实例化它:
class MyClass(values: Int* = 42) { }
但是,编译器和REPL给我以下错误:
<console>:7: error: type mismatch;
found : Int(42)
required: Int*
class MyClass(values: Int* = 42) { }
^
<console>:7: error: a parameter section with a `*'-parameter is not allowed to have default arguments
class MyClass(values: Int* = 42) { }
作为一种变通办法,我尝试了以下操作,但是它也不起作用:(显然,它非常模棱两可。)
class MyClass(value: Int = 42, otherValues: Int*) { }
我想知道为什么不允许使用varargs参数的默认值。这是什么原因或技术原因?(我的猜测是,指定一个空的varargs需要一些特殊的语法或习惯用法,但是我不确定这是否足够。)
考虑一下,我想这只是不增加太多复杂性的问题,假设您有
def f(a: A, xs: X* = Seq(x0, x1)) = ???
现在,呼叫者使用的是这样的:f(a)
。
我们如何知道调用方是否打算X*
通过不提供零长度列表或希望通过不提供默认值来触发默认参数X*
?在您的示例中,您假定只有第二种情况,并且编译器需要提供默认参数值。但是,空Seq()
值已经是调用方提供的完全有效的值。我猜呼叫者可以写,f(a, Seq(): _*)
但是很麻烦。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句