2012-10-15 11 views
6

Soweit ich gelernt habe, sind Merkmale in Scala ähnlich zu Schnittstellen in Java, außer Methoden dürfen eine Implementierung haben. Im Gegensatz zu Scala-Klassen können Sie ihnen auch keine Argumente für die Konstruktion übergeben.Warum sind Merkmale instanziierbar?

So weit, so gut. Aber warum darf ich sie instanziieren? Wirklich, ich sehe keinen guten Grund, dies zuzulassen.

+1

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

Antwort

22

Sie instanziieren sie nicht wirklich. Wenn Sie eine Parallele zu Java ziehen, lassen Sie uns weiter darauf eingehen. Sie können in Java eine Anonyme Klasse aus einer abstrakten Klasse oder einer Schnittstelle erstellen. Es ist fast das gleiche in Scala:

scala> trait A 
defined trait A 

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

Beachten Sie, dass die geschweiften Klammern obligatorisch sind, wenn Sie ein Objekt aus einem Merkmal erstellen. Zum Beispiel yon nicht tun können:

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

Während es wäre perfekt für eine Klasse funktioniert:

scala> class B 
defined class B 

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

Natürlich, wenn einige Elemente in Ihrer Eigenschaft nicht umgesetzt werden, müssen Sie sie implementieren, wenn Sie erstellen das Objekt:

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, das hat etwas Licht ins Dunkel gebracht :-). – helpermethod

+4

Um es mit Java zu vergleichen: Wenn Sie 'new A {}' schreiben, erstellen Sie eine anonyme Klasse, die das Merkmal 'A' erweitert; Das '{}' ist der Körper der anonymen Klasse (genau wie anonyme innere Klassen in Java). – Jesper

+0

'new A {}' ist dasselbe wie 'new Object with A' – sourcedelica