“类声明头” { val_name : Type => 的语法含义是什么? `类体`}”
在阅读一些有关 Scala 的文章时,我发现了一些语法奇怪的示例,我可能会理解错误
class Child[C <: Child[C]] {
some_name : C => // here, what does it mean?
var roomie : Option[C] = None
def roomWith(aChild : C)= {
roomie = Some(aChild)
aChild.roomie = Some(this)
}
}
class Boy extends Child[Boy]
我发现了类似的具有特征的例子。
这是否意味着我在类作用域中将 this
对象声明为 C
类型?
When reading some articles about Scala, I found some examples with a curious syntax, which I might understand incorrectly
class Child[C <: Child[C]] {
some_name : C => // here, what does it mean?
var roomie : Option[C] = None
def roomWith(aChild : C)= {
roomie = Some(aChild)
aChild.roomie = Some(this)
}
}
class Boy extends Child[Boy]
I found similar examples with traits.
Does it mean that I declare this
object in a class scope to by type of C
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它是一个自我类型注释。
这意味着类
Child
必须是C
类型,即创建必须满足给定类的继承依赖关系。一个小例子:
在这种情况下,
Foo
也需要是Baz
。满足该要求后,可以创建一个
Foo
实例。此外,定义一个新类(在本例中为
Bar
)还要求它也是Baz
。看:
http://www.scala-lang.org/node/124
It is a self type annotation.
This means that class
Child
must be of typeC
, i.e., creates inheritance dependencies which must satisfied for a given class.A small example:
In this case
Foo
is required to also be aBaz
.Satisfying that requirement, a
Foo
instance can be created.Also, defining a new class (in this case
Bar
) there is also the requirement of it beingBaz
as well.See:
http://www.scala-lang.org/node/124
self 类型的一个非常有用的应用是 CRTP 的不太详细的实现( http://en.wikipedia.org /wiki/Curiously_recurring_template_pattern ),例如
尝试用继承“欺骗”是行不通的:
One very useful application of self types is a less verbose implementation of the CRTP ( http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern ), e.g.
Attempts to "cheat" with the inheritance won't work:
除了 JaimeJorge 响应中的继承要求之外,如果您想从内部类引用外部实例,还可以使用 self 类型为外部实例命名:
In addition to the inheritance requirement in JaimeJorge's response, self types can be used to give the outer instance a name if you want to refer to it from an inner class: