2013-12-17 4 views
5

В Scala мы используем смесь в следующим образом:Есть ли «A с B» типа?

class C extends A with B 

Я понимаю, это заявление как C подкласс A with B. Это правда? Или C - это просто подкласс как A, так и B (я не думаю, что это возможно на JVM, который не поддерживает многоуровневое)?

Если A with B - это тип, почему эта линия не работает?

classOf[A with B] 

Еще одна причина, почему я считаю A with B типа является то, что он может быть использован в шаблоне сопоставляются:

val c = new C 
val u = c match { case a: A with B => 1 } // 1 

ответ

4

Scala поддерживает множественное наследование через черты. Любой класс может распространять 0 или 1 класс, но также может «смешивать» любое количество признаков. (Существует немного магии компилятора, который переставляет вещи за кулисами, чтобы соответствовать ограничениям в JVM в) Синтаксис вдоль линий

class MyClass extends [ClassOrTrait] with [Trait] with [AnotherTrait] with ... 

Так что ваше определение класса C больше похож

class ((C extends A) with B) чем как class (C extends (A with B))

A with B тип, и может быть использован в качестве типа псевдонима, но метод classOf хочет класс:

scala> type AB = A with B 
defined type alias AB 

scala> classOf[AB] 
<console>:11: error: class type required but A with B found 
       classOf[AB] 
        ^

против

scala> class AB extends A with B 
defined class AB 

scala> classOf[AB] 
res12: Class[AB] = class AB 
0

Я согласен с @Dylan. A with B - это только определение типа. Однако для работы с classOf[T] он должен иметь Java класс или интерфейс, созданный Scala.

scala> trait A 
defined trait A 

scala> trait B 
defined trait B 

scala> trait AB extends A with B 
defined trait AB 

scala> class C extends A with B 
defined class C 

scala> type TypeAB = A with B 
defined type alias TypeAB 

scala> println(classOf[A]) 
interface $line3.$read$$iw$$iw$A 

scala> println(classOf[B]) 
interface $line4.$read$$iw$$iw$B 

scala> println(classOf[AB]) 
interface $line5.$read$$iw$$iw$AB 

scala> println(classOf[C]) 
class $line6.$read$$iw$$iw$C 

scala> println(TypeAB) 
<console>:8: error: not found: value TypeAB 
       println(TypeAB) 
         ^

scala> classOf[TypeAB] 
<console>:11: error: class type required but A with B found 
       classOf[TypeAB] 

Также интересно, что Scala делает удается соответствовать with в случае конструкции.

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