I’m looking for a way to define a method that returns a type T where T = the type of the subclass.
I know I could possibly do this using abstract types, but dislike the overhead of having to redefine T for each subclass.
Some sample code:
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
}
Possibly a new language feature has made this easier? Or can I use this.type in some way? It’s important to me that I be able to define a helper class that can call into foo in this way.
If you are always returning
this, then you can indeed have as return typethis.type. Or have you tried it already?this.typeis especially useful e.g. when you want to chain calls to the same object, or provide a static guarantee that you will be returning the same object (and not a copy). For instance,Buffers in Scala have the append operation:+, which returns aBuffer[A], and+=, which returnsthis.type. The former duplicates the mutable sequence; the latter guarantees that you update the original object.