簡體   English   中英

常見的方法超類

[英]Common supertype of methods

請考慮以下定義:

trait Event
case class Event1[A] extends Event
case class Event2[A, B] extends Event
/* ... */

trait Filter { val cond: Event => Boolean }
case class Filter1[A](cond: Event1[A] => Boolean) extends Filter
case class Filter2[A, B](cond: Event2[A, B] => Boolean) extends Filter
 /* ... */

我想我在這里要完成的工作很清楚:我想確保每次遇到Filter ,都保證有一個cond函數,該函數接受Event的相應子類型並給我一個布爾值。 顯然,上面的代碼無法編譯,例如, Event1[A] => Boolean實際上不是Event => Boolean的子類型。 一個人將如何解決這一問題?

如下所示呢?

sealed trait Event
case class Event1[A]() extends Event
case class Event2[A, B]() extends Event
/* ... */

sealed trait Filter[T <: Event] { val cond: T => Boolean }
case class Filter1[A](cond: Event1[A] => Boolean) extends Filter[Event1[A]]
case class Filter2[A, B](cond: Event2[A, B] => Boolean) extends Filter[Event2[A, B]]

或者,您可以覆蓋抽象類型,而不是使用參數化類型:

sealed trait Filter {
  type Filterable
  val cond: Filterable => Boolean
}
case class Filter1[A](cond : Event1[A] => Boolean) extends Filter{
  override type Filterable = Event1[A]
}

case class Filter2[A, B](cond: Event2[A, B] => Boolean) extends Filter{
  override type Filterable = Event2[A, B]
}

嘗試這個:

  trait Event
  case class Event1[A](a: A) extends Event
  case class Event2[A, B](a: A, b: B) extends Event

  trait Filter[T <: Event] { val cond: T => Boolean }
  case class Filter1[A](cond: Event1[A] => Boolean) extends Filter[Event1[A]]
  case class Filter2[A, B](cond: Event2[A, B] => Boolean) extends Filter[Event2[A, B]]

它為我編譯

暫無
暫無

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

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