據我所知,Scala中的特徵與Java中的接口相似,除了方法被允許有一個實現。另外,與Scala類不同,你不能傳遞它們的參數來構造。爲什麼性狀可實例化?
到目前爲止,這麼好。但爲什麼我允許實例化它們?真的,我認爲沒有理由允許這樣做。
據我所知,Scala中的特徵與Java中的接口相似,除了方法被允許有一個實現。另外,與Scala類不同,你不能傳遞它們的參數來構造。爲什麼性狀可實例化?
到目前爲止,這麼好。但爲什麼我允許實例化它們?真的,我認爲沒有理由允許這樣做。
你並沒有真正實例化它們。正如你提到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]
+1 Thx,它揭示了它:-)。 – helpermethod
將其與Java進行比較:當您編寫'new A {}'時,您將創建一個擴展特徵'A'的匿名類; '{}'是匿名類的主體(就像Java中的匿名內部類)。 – Jesper
'new A {}'與'具有A的新對象'是一回事' – sourcedelica
Java:'interface Bar {}; Bar bar = new Bar(){};' – soc