To się nazywa auto-tupling.
Kompilator spróbuje nadrobić dodatkowe argumenty, zawijając je wszystkie w krotkę.
Wrapped(1,2,3,4)
zostanie automatycznie przekształcony
Wrapped((1,2,3,4))
Nawiasem mówiąc, jest to denerwujące i zaskakująca funkcja i mam nadzieję, że w końcu będą przestarzałe. W międzyczasie masz dwie opcje kompilatora dostępny:
-Ywarn-adapted-args
, który ostrzega w przypadku autotupling
-Yno-adapted-args
, że daje błąd w tych samych okolicznościach
Przykład z ostrzeżeniem:
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))
Przykład z błędem:
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)
^
Twoja opakowana instancja ma tylko jeden argument - 'Tuple4 [Int, Int, Int, Int]'. – Lee