2013-12-17 76 views
5

在Scala中,我們使用混合式這樣的:「A with B」是什麼類型?

class C extends A with B 

我明白這個聲明爲CA with B一個子類。這是真的?或者C只是AB的子類(我認爲不可能在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

斯卡拉支持通過性狀多重繼承。任何班級可以擴展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] 
        ^

VS

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]一起使用,它需要具有由Scala生成的Java 接口

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] 

而且有趣的是,斯卡拉管理的情況下,構建以匹配with

相關問題