“A与B”是一种类型吗?

时间:2013-12-17 17:22:46

标签: scala inheritance mixins

在Scala中,我们使用这样的混合:

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

2 个答案:

答案 0 :(得分:4)

Scala通过 traits 支持多重继承。任何课程都可以扩展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

答案 1 :(得分: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]

另外有趣的是,Scala 设法匹配案例构造中的with