Scala代码:
trait X trait Y1 { this: X => } trait Y2 extends X { }
我想知道Y1和Y2特征之间有什么区别?如果我有一个Z类需要扩展Y:
class Z1 extend Y1 with X class Z2 extends Y2
似乎两个类Z1和Z2没有区别.如果它们几乎相同,你会推荐哪种款式?
解决方法
有时,您处于深度嵌套的范围内,并且别名对外部对象很有用,例如
here.
如here所解释的,这两种类型的线性化是相反的.
也就是说,你有这个:Y与X和这:X与Y.
这很重要(双关语):
scala> trait X { type T } defined trait X scala> trait Y { type T <: String ; def t: T ; def f = t.length } defined trait Y scala> trait Y { this: X => type T <: String ; def t: T ; def f = t.length } <console>:8: error: value length is not a member of Y.this.T trait Y { this: X => type T <: String ; def t: T ; def f = t.length } ^ scala> trait Y { this: X with Y => type T <: String ; def t: T ; def f = t.length } defined trait Y scala> trait Y extends X { type T <: String ; def t: T ; def f = t.length } defined trait Y
但正如相关的,权威的答案所说,它可能并不重要.