Scala抽象类型表示子类的类型

时间:2011-07-29 09:37:43

标签: scala

我正在寻找一种方法来定义一个返回类型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的辅助类。

3 个答案:

答案 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)