St.*_*rio 0 inheritance scala case
我是Scala的新手并尝试使用以下继承:
abstract class Command(arg: Any)
case object Help extends Command // <---- Ok
Run Code Online (Sandbox Code Playgroud)
但如果我用这个代替它:
abstract class Command(arg: Option[Any])
case object Help extends Command // <---- Fail
Run Code Online (Sandbox Code Playgroud)
为什么?为什么它在第一个例子中工作?
第一种情况是编译器接受的,因为它使构造函数参数适应(),即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
Run Code Online (Sandbox Code Playgroud)
如你所见,这一行:
case object Help extends Command
Run Code Online (Sandbox Code Playgroud)
已被编译器重写为:
case object Help extends Command(())
Run Code Online (Sandbox Code Playgroud)
也就是说,它()作为构造函数参数传递,这很好,因为参数应该是类型Any,并Unit满足该约束.
但是,在第二种情况下,构造函数参数是类型的Option,并且Unit不满足该约束,因此编译器不能神奇地填充构造函数参数.
无论如何,最好通过使用scalac选项完全禁用这种魔术行为-Yno-adapted-args.