[英]Scala abstract type representing type of subclass
我正在尋找一種方法來定義一個返回類型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的輔助類。
如果你總是返回this
,那么你的確可以返回類型this.type
。 或者你已經試過了嗎?
this.type
特別有用,例如,當您想要將調用鏈接到同一個對象,或提供靜態保證,您將返回相同的對象(而不是副本)。 例如,Scala中的Buffer
有附加操作:+
,返回Buffer[A]
, +=
,返回this.type
。 前者復制了可變序列; 后者保證您更新原始對象。
為了跟進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>
}
}
我發現以下習語很有用:
class MyClass[T] {
self: T =>
def foo(): Option[T] = Some(this)
}
class ChildClass extends MyClass[ChildClass]
new ChildClass().foo()
//--> Option[ChildClass] = Some(ChildClass@2487b1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.