`trait Y {this:X =>之间有什么区别? }`和`trait Y扩展X {}`

时间:2014-05-03 03:27:41

标签: scala traits

Scala代码:

trait X

trait Y1 {
  this: X => 
}

trait Y2 extends X {
}

我想知道Y1Y2特征之间有什么区别?如果我有课程Z需要延长Y

class Z1 extend Y1 with X

class Z2 extends Y2

似乎两个班级Z1Z2没有区别。如果它们几乎相同,你会推荐哪种风格?

2 个答案:

答案 0 :(得分:2)

有时,您处于深度嵌套的范围内,并且别名对外部对象很有用,例如here

正如here所解释的那样,this的两种类型的线性化被反转。

也就是说,您有this: Y with Xthis: X with Y

this重要(双关语):

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

但正如相关的权威性答案所说,这可能无关紧要。

答案 1 :(得分:1)

trait B extends A表示B 是A。

trait B { this: A => }是依赖注入 - 你希望B 要求 A.

考虑这两个REPL会话:

> trait A
defined trait A

> trait B extends A
defined trait B

> class C
defined class C

> new C with A
res0: C with A = $anon$1@706abf59

> new C with B
res1: C with B = $anon$1@2004aa19

而且:

> trait A
defined trait A

> trait B { this : A => }
defined trait B

> class C
defined class C

> new C with A
res0: C with A = $anon$1@1ef535db

> new C with B
<console>:11: error: illegal inheritance;
 self-type C with B does not conform to B's selftype B with A
          new C with B
                     ^