继承不带参数

问题描述:

我是新来斯卡拉,并试图采用以下继承:继承不带参数

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完全禁用这种魔术行为。