【问题标题】:Type parameter for classes implementing trait disregarding trait parameters实现特征的类的类型参数,忽略特征参数
【发布时间】:2018-04-11 20:58:46
【问题描述】:

我有一个带有类型参数的特征,它有一个列表,其中包含实现此特征的另一个类的实例。我不关心这些实例的类型参数,所以我尝试定义一个类型,该类型允许任何子类使用任何类型参数实现特征。

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)

【问题讨论】:

  • 还有一个问题是这样的事情是否可行

标签: scala types traits type-parameter


【解决方案1】:

首先,从你的问题中不清楚你是如何使用这个特性的。我想你可能想要这样的东西:

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 &lt;: 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[_, _]
}

【讨论】:

猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 2015-08-07
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多