2017-06-13 72 views
0

我是新來斯卡拉,並試圖採用以下繼承:繼承不帶參數

abstract class Command(arg: Any) 

case object Help extends Command // <---- Ok 

但是,如果我這個替換它:

abstract class Command(arg: Option[Any]) 

case object Help extends Command // <---- Fail 

爲什麼?爲什麼它在第一個例子中工作?

回答

5

第一種情況是由編譯器,因爲它相適應的構造函數的參數是(),即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完全禁用這種魔術行爲。