2016-06-17 3 views
1

Я немного смущен о чертах Scala. Что такое точное значениеСписок признаков в Scala

val myList = List[MyTrait] 

где MyTrait является чертой.

Означает ли это, что myList может содержать любой экземпляр класса (MyClass), который смешивает-в MyTrait? Если да, разве это не странно, потому что MyClass не является MyTrait (или не так ли?).

Благодарим за помощь.

+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.

Чтобы идти дальше вы можете даже указать класс и черта, как это:

Если Animal класс и Fly черта, определяют метод 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 наследует оба A и B черты. Так что это не странно.

1

Я думаю, реальный вопрос, вы спрашиваете только это:

Если да, то не это немного странно, потому что MyClass не MyTrait (или это?).

Это. MyClass наследует от MyTrait, поэтому MyClass IS-A MyTrait.

+0

Да, было непонятно для меня эта черта была на самом деле классом. Спасибо. – stackoverflowed

Смежные вопросы