继承不带参数
问题描述:
我是新来斯卡拉,并试图采用以下继承:继承不带参数
abstract class Command(arg: Any)
case object Help extends Command // <---- Ok
但是,如果我这个替换它:
abstract class Command(arg: Option[Any])
case object Help extends Command // <---- Fail
为什么?为什么它在第一个例子中工作?
答
第一种情况是由编译器,因为它相适应的构造函数的参数是()
,即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
完全禁用这种魔术行为。