繁体   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