我正在寻找一种方法来定义一个返回类型T的方法,其中T =子类的类型.
我知道我可以使用抽象类型来做这件事,但不喜欢为每个子类重新定义T的开销.
一些示例代码:
object Helper {
def help[A <: MyClass](cls: A): Option[A] = { cls.foo() map { _.asInstanceOf[A] } }
}
class MyClass {
type T <: MyClass
def foo(): Option[T] = Some(this.asInstanceOf[T])
}
class ChildClass extends MyClass {
type T = ChildClass
}
Run Code Online (Sandbox Code Playgroud)
可能新的语言功能使这更容易?或者我可以用某种方式使用this.type吗?对我来说很重要的是我能够定义一个可以用这种方式调用foo的辅助类.
如果你总是返回this,那么你确实可以将其作为返回类型this.type。或者你已经尝试过了吗?
this.type特别有用,例如当您想要链接对同一对象的调用,或提供静态保证您将返回同一对象(而不是副本)时。例如,BufferScala 中的 s 有追加操作:+,它返回 a Buffer[A],并且+=,它返回this.type。前者复制可变序列;后者保证您更新原始对象。