2016-06-17 2 views
1

저는 스칼라 특성에 대해 약간 혼란 스럽습니다.스칼라의 특성 목록

의 정확한 의미는 무엇입니까
val myList = List[MyTrait] 

여기서 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

  • Any
  • AnyRef/java.lang.Object그래서 당신은 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

    관련 문제