我正在学习抽象类,这个链接非常有用。
scala generic method overriding
abstract class Foo[T] { self:T =>
def bar1(f:T):Boolean
def bar2(f:T):T
}
class FooImpl extends Foo[FooImpl]{
override def bar1(f:FooImpl) = true
override def bar2(f:FooImpl) = f
}
self:T代表什么?T是我理解的类参数。
答案 0 :(得分:3)
正如@cchantep在评论中提到的,self : T
在这种情况下是自我类型注释,基本上说Foo[T]
的实例也需要表现为{{ 1}}。您可以在T
中看到FooImpl
确实如此。
您可以找到有关自我类型注释here,here或here的更多信息。请注意,在大多数情况下,您将看到它在依赖注入和蛋糕模式的上下文中使用。
the second link最感兴趣的是我认为最初的部分:
换句话说,这样做有什么意义:
FooImpl <: Foo
trait A
当你可以这样做时:
trait B { this: A => }
trait A
为什么要使用[这种语法]?
[...]答案通常归结为“B要求A”(注释)与“B为A”(继承),前者更适合依赖管理。
最后,只是为了澄清,请注意trait B extends A
这个词根本不是必需的。这可以是任何有效的变量名称,但self
或self
大部分时间都是约定。也就是说,你可能会这样做:
this
但那不太常见。