簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM