scala – `trait Y {this:X =>}`和`trait Y extends X {}之间有什么区别?

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

但正如相关的,权威的答案所说,它可能并不重要.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...