"A与B"是一种类型吗?

Lai*_*uan 5 inheritance scala mixins

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

class C extends A with B
Run Code Online (Sandbox Code Playgroud)

我理解这个声明C是一个子类A with B.这是真的?或者C仅仅是两个子类AB(我不认为这是可能的JVM上不支持多继承)?

如果A with B是一种类型,为什么这条线不起作用?

classOf[A with B]
Run Code Online (Sandbox Code Playgroud)

我考虑A with B类型的另一个原因是它可以用于模式匹配:

val c = new C
val u = c match { case a: A with B => 1 } // 1
Run Code Online (Sandbox Code Playgroud)

Dyl*_*lan 4

Scala 通过Trait支持多重继承。任何类都可以扩展 0 或 1 个类,但也可以“混合”任意数量的特征。(有一些编译器魔法可以在幕后重新排列事物以符合 JVM 的限制)语法类似于

class MyClass extends [ClassOrTrait] with [Trait] with [AnotherTrait] with ...
Run Code Online (Sandbox Code Playgroud)

所以你的 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]
                      ^
Run Code Online (Sandbox Code Playgroud)

scala> class AB extends A with B
defined class AB

scala> classOf[AB]
res12: Class[AB] = class AB
Run Code Online (Sandbox Code Playgroud)