2012-10-15 95 views
6

據我所知,Scala中的特徵與Java中的接口相似,除了方法被允許有一個實現。另外,與Scala類不同,你不能傳遞它們的參數來構造。爲什麼性狀可實例化?

到目前爲止,這麼好。但爲什麼我允許實例化它們?真的,我認爲沒有理由允許這樣做。

+1

Java:'interface Bar {}; Bar bar = new Bar(){};' – soc

回答

22

你並沒有真正實例化它們。正如你提到Java的一個平行,讓我們繼續深入。您可以使用Java從抽象類或接口構建Anonymous類。這幾乎是相同的斯卡拉:

scala> trait A 
defined trait A 

scala> new A {} 
res0: A = [email protected] 

注意花括號強制性當你創建一個從特質的對象。例如,馮不能做:

scala> new A 
<console>:9: error: trait A is abstract; cannot be instantiated 
       new A 
      ^

雖然這將完全適用於A類:

scala> class B 
defined class B 

scala> new B 
res2: B = [email protected] 

當然,如果在你的特質一些元素沒有實現,你需要在創建實現它們對象:

scala> trait C {def foo: Int} 
defined trait C 

scala> new C {} 
<console>:9: error: object creation impossible, since method foo in trait C of type => Int is not defined 
       new C {} 
       ^

scala> new C {def foo = 42} 
res4: C = [email protected] 
+0

+1 Thx,它揭示了它:-)。 – helpermethod

+4

將其與Java進行比較:當您編寫'new A {}'時,您將創建一個擴展特徵'A'的匿名類; '{}'是匿名類的主體(就像Java中的匿名內部類)。 – Jesper

+0

'new A {}'與'具有A的新對象'是一回事' – sourcedelica

相關問題