我正在寻找一种方法来定义一个返回类型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
}
可能新的语言功能使这更容易吗?或者我可以用某种方式使用this.type吗?对我来说很重要的是我能够定义一个可以用这种方式调用foo的辅助类。
答案 0 :(得分:3)
如果您总是返回this
,那么您的确可以作为返回类型this.type
。或者你已经尝试过了吗?
this.type
特别有用,例如当你想链接到同一个对象的调用,或提供静态保证,你将返回相同的对象(而不是副本)。例如,Scala中的Buffer
具有追加操作:+
,其返回Buffer[A]
,+=
返回this.type
。前者复制了可变序列;后者保证您更新原始对象。
答案 1 :(得分:2)
跟进Jean-Phillippe的回答,他写的是我写作的时候,这是代码:
trait SomeTrait {
def foo: this.type = this
}
class UsesTrait extends SomeTrait
object Main {
def main(args: Array[String]) {
println((new UsesTrait).foo) // prints UsesTrait@<hash value>
}
}
答案 2 :(得分:2)
我发现以下习语很有用:
class MyClass[T] {
self: T =>
def foo(): Option[T] = Some(this)
}
class ChildClass extends MyClass[ChildClass]
new ChildClass().foo()
//--> Option[ChildClass] = Some(ChildClass@2487b1)