参见代码
case class Wrapped[A](elem: A)(implicit ordering: Ordering[A])
extends Ordered[Wrapped[A]] {
def compare(that: Wrapped[A]): Int = ordering.compare(this.elem, that.elem)
}
我在这里定义case class
。
然后致电
Wrapped(1,2,2,4)
。
令我惊讶的是,即使Wrapped(1,2,3,4,5)
(任意数量的参数)也能正常工作而不会编译错误。
答案 0 :(得分:14)
它被称为自动元组。
编译器将尝试通过将所有参数包装在元组中来弥补额外的参数。
Wrapped(1,2,3,4)
自动变成
Wrapped((1,2,3,4))
顺便说一句,这是一个令人烦恼且令人惊讶的功能,我真的希望它最终会被弃用。同时,您有两个可用的编译器选项:
-Ywarn-adapted-args
,在自动组合的情况下发出警告-Yno-adapted-args
,在相同情况下出错警告示例:
scala -Ywarn-adapted-args
scala> case class Foo[A](a: A)
scala> Foo(1, 2)
<console>:10: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
signature: Foo.apply[A](a: A): Foo[A]
given arguments: 1, 2
after adaptation: Foo((1, 2): (Int, Int))
Foo(1, 2)
^
res1: Foo[(Int, Int)] = Foo((1,2))
错误示例:
scala -Yno-adapted-args
scala> case class Foo[A](a: A)
defined class Foo
scala> Foo(1, 2)
<console>:10: warning: No automatic adaptation here: use explicit parentheses.
signature: Foo.apply[A](a: A): Foo[A]
given arguments: 1, 2
after adaptation: Foo((1, 2): (Int, Int))
Foo(1, 2)
^
<console>:10: error: too many arguments for method apply: (a: (Int, Int))Foo[(Int, Int)] in object Foo
Foo(1, 2)
^
答案 1 :(得分:1)
仔细查看您的代码:
Wrapped(1,2,3,4,5)
res0: Wrapped[(Int, Int, Int, Int, Int)] = Wrapped((1,2,3,4,5))
将参数压缩为Tuple
个对象。因此,您有Wrapped[(Int, Int, Int, Int, Int)]
而不是所需的Wrapped[Int]
。