在Scala中,我们使用这样的混合:
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
答案 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
。