簡體   English   中英

實現 trait 的類的類型參數而忽略 trait 參數

[英]Type parameter for classes implementing trait disregarding trait parameters

我有一個帶有類型參數的特征,它有一個列表,其中包含實現此特征的另一個類的實例。 我不關心這些實例的類型參數,所以我嘗試定義一個類型,允許任何子類使用任何類型參數實現特征。

trait Synchronizable[A,B] {
  type S <: Synchronizable[_,_]

  val slaves: MutableList[S]

  def synchronizeWith(q: S) = {
    if (!slaves.contains(q)) slaves += q
  }

}

但由於某些特定實例不符合此類型定義,因此無法編譯。

[error]  found   : TwoBuffers.this.faster.type (with underlying type model.collection.SynchronizableTimeSeriesBuffer[someCaseClass ,Option[Any]])
[error]  required: TwoBuffers.this.slower.S
[error]     slower.synchronizeWith(faster)

首先,從你的問題中不清楚你是如何使用這個特性的。 我想你可能想要這樣的東西:

trait Synchronizable[A,B] {
  type S = Synchronizable[_, _] // Note =, not <:

  val slaves = MutableList.empty[S] // Create list in trait.

  def synchronizeWith(q: S) = {
    if (!slaves.contains(q)) slaves += q
  }
}

或者,如果您確實需要使用type S <: Synchronizable[_, _]聲明,那么您將需要覆蓋子類中的type語句。 例如:

trait Synchronizable[A,B] {
  type S <: Synchronizable[_, _]

  val slaves = MutableList.empty[S] // Create list in trait.

  def synchronizeWith(q: S) = {
    if (!slaves.contains(q)) slaves += q
  }
}

class SomeClass[A, B]
extends Synchronizable[A, B] {
  override type S = SomeClass[_, _]
}

暫無
暫無

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

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