Lai*_*uan 5 inheritance scala mixins
在Scala中,我们使用这样的混合:
class C extends A with B
Run Code Online (Sandbox Code Playgroud)
我理解这个声明C是一个子类A with B.这是真的?或者C仅仅是两个子类A和B(我不认为这是可能的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)
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)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |