簡體   English   中英

在不進行強制轉換的情況下覆蓋trait的泛型方法

[英]Override trait's generic method without casting

我計划有一個具有“value”屬性的特性,可以通過多個類進行擴展。 然后我需要能夠比較彼此之間的特征的不同實例。 首先,我想檢查在特征上定義的值 - 如果在兩個實例中相同,那么我想觸發特定於子的方法,該方法將相同類型的兩個子實例相互比較。

我希望我能夠清楚地解釋清楚......

我編寫了下面的代碼,但是ChildOne類沒有編譯 - 我得到的錯誤:

class ChildOne需要是抽象的,因為方法childCheck in trait ParentType類型(其他:ChildOne.this.T)布爾值未定義(請注意,ParentType.this.T與com.cards.ChildOne不匹配)

trait ParentType {
  val value: Int
  type T <: ParentType

  def parentCheck(other: T): Boolean = {
    if (this.value == other.value) childCheck(other)
    else this.value > other.value
  }

  def childCheck(other: T): Boolean
}

case class ChildOne(name: String) extends ParentType {
  val value = 1

  override def childCheck(other: ChildOne): Boolean = {
    true //some custom logic for each child...
  }

}

我可以將child的方法的參數更改為ParentType,然后將其強制轉換,但我想避免這種情況,我想知道是否有更好的方法來實現我想要實現的目標?

任何幫助贊賞。

您在ParentType聲明了一個抽象類型 T,而沒有在ChildOne覆蓋它。 你可以通過覆蓋ChileOne T來輕松解決這個ChileOne

case class ChildOne(name: String) extends ParentType {
  val value = 1
  override type T = ChildOne  // <----

  override def childCheck(other: ChildOne): Boolean = {
    true //some custom logic for each child...
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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