通用的“嵌套成员”特征

时间:2019-06-27 21:24:10

标签: scala generics

我正在构建一个由多个特征组成的类,其中一个特征提供了包含该类“成员”列表的功能:

trait WithNestedMembers[T] {
  val members = new scala.collection.mutable.ListBuffer[T]
}

class MainClass extends WithNestedMembers[MainClass] {
  // ...
}

这似乎很好。

现在,我想在其他特征中使用“嵌套”功能:

trait NestingUser {
  this: WithNestedMembers[NestingUser] =>
  var nestedValue = 0
  def sumNested = nestedValue + members.map(_.nestedValue).sum
}

该定义似乎可以正常工作。但是,我不能将其用作MainClass的一部分。以下显示错误:

class MainClass extends WithNestedMembers[MainClass] with NestingUser {
  // Illegal inheritance, self-type MainClass does not conform to WithNestedMembers[NestingUser]
}

我怀疑我需要在某处使用某种类型界限,以说明WithNestedMembers[MainClass]足以满足要求WithNestedMembers[NestingUser]。但是在哪里?

1 个答案:

答案 0 :(得分:4)

尝试像这样用T制作+T covariant

trait WithNestedMembers[+T] {
  val members = List.empty[T]
}