第一種情況是由編譯器,因爲它相適應的構造函數的參數是()
,即Unit
類型的單個實例接受:
$ scala -Xlint:adapted-args
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112).
Type in expressions for evaluation. Or try :help.
scala> abstract class Command(arg: Any)
defined class Command
scala> case object Help extends Command
<console>:12: warning: Adaptation of argument list by inserting() is deprecated: leaky (Object-receiving) target makes this especially dangerous.
signature: Command(arg: Any): Command
given arguments: <none>
after adaptation: new Command((): Unit)
case object Help extends Command
^
defined object Help
正如你可以看到,這條線:
case object Help extends Command
已通過編譯器改寫爲:
case object Help extends Command(())
也就是說,它通過()
作爲構造函數參數,這很好,因爲參數的意思是Any
,而Unit
滿足該約束。
然而,在第二種情況下,構造器參數是Option
類型,並且將Unit
不滿足該約束,所以編譯器不能神奇地在構造參數填充。
在任何情況下,最好通過使用scalac選項-Yno-adapted-args
完全禁用這種魔術行爲。