2016-06-17 16 views
1

私はScalaの特徴についてちょっと混乱しています。 MyTraitが特徴ですScalaの形質のリスト

val myList = List[MyTrait] 

の正確な意味は何ですか。

myListには、MyTraitが混在するクラス(MyClass)のインスタンスを含めることはできません。 もしそうなら、MyClassMyTrait(またはそれですか?)ではないので少し奇妙ではありませんか?

ありがとうございました。

+0

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

答えて

1

実際には、リストをList[MyTrait]として宣言すると、MyTraitに混在するオブジェクトのコンテナになります。

は、あなたも、このようなクラスと特性を指定することができ、さらに移動するには: Animalfly()メソッドを定義するクラスと Fly形質である

場合。

List[Animal with Fly]は、飛行できるすべての動物のリストになります。

1

お持ちの場合は

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

その後MyClassIS A

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

これらの型(またはMyClassそのもの)のいずれかが必要な場合だから、どこでもMyClassのインスタンスを使用することができます。

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]) 

クラスCは両方ABの特徴を継承します。だからそれは奇妙ではない。

1

私は、あなたが求めている本当の質問はちょうどこのだと思う:MyClassMyTraitはないので、その場合は

、それは少し奇妙ではありません(またはそれがあります?)。

です。 MyClassMyTraitを継承しますので、MyClass IS-A MyTraitです。

+0

はい、明確ではありませんでした私には、形質は実際にはクラスであった。どうも。 – stackoverflowed