2016-06-17 7 views
1

Ich bin etwas verwirrt über Scala-Merkmale. Was ist die genaue Bedeutung vonListe der Merkmale in Scala

val myList = List[MyTrait] 

wo MyTrait ein Merkmal ist.

Bedeutet das nicht, dass myList eine Instanz der Klasse (MyClass) enthalten kann, die MyTrait mischt? Wenn ja, ist es nicht ein bisschen seltsam, weil MyClass ist kein MyTrait (oder ist es?).

Danke für Ihre Hilfe.

+0

http://stackoverflow.com/questions/663254/war-doesnt-the-example-compile-aka-how-does-co-contra-and-in-variance-w – Rumoku

Antwort

1

In der Tat, wenn Sie Ihre Liste als List[MyTrait] deklarieren, wird es ein Container für jedes Objekt sein, das MyTrait mischt.

Um weiter gehen Sie sogar eine Klasse und ein Merkmal wie folgt angeben:

Wenn Animal ist eine Klasse und Fly eine Eigenschaft, die die fly() Methode definieren.

List[Animal with Fly] wird eine Liste aller Tiere sein, die fliegen können.

1

Wenn Sie

trait MySuperTrait 
trait MyTrait extends MySuperTrait 
trait MyOtherTrait 
abstract class MyAbstractClass 
class MyClass extends MyAbstractClass with MyTrait with MyOtherTrait 

Dann MyClassIS A:

  • MyAbstractClass
  • MyTrait
  • MySuperTrait
  • MyOtherTrait
  • AnyRef/java.lang.Object
  • Any

So können Sie eine Instanz von MyClass überall dort verwenden, wo einer dieser Typen (oder MyClass selbst) erforderlich ist.

1
trait A 
trait B 

class C extends A with B 

val aList = List[A]() 
// aList: List[A] = List() 

val bList = List[B]() 
// bList: List[B] = List() 

new C :: aList 
// res1: List[A] = List([email protected]) 

new C :: bList 
// res2: List[B] = List([email protected]) 

Klasse C erbt beide A und B Züge. Es ist also nicht komisch.

1

Ich denke, die echte Frage, die Sie gefragt werden, ist gerade dies:

Wenn ja, ist es nicht ein bisschen komisch, weil MyClass ist kein MyTrait (oder ist es?).

Es ist. MyClass erbt von MyTrait, also MyClass IS-A MyTrait.

+0

Ja, es war nicht klar für mich war das eine Eigenschaft, eine Klasse. Danke. – stackoverflowed