【发布时间】:2020-01-19 01:41:04
【问题描述】:
我有一个特征GameStatistics,它定义了一个add() 方法,该方法接受一个参数并返回其自身和参数之和。子类中的实现应该只接受它们自己类型的实例作为参数(或者也可能是子类型)。
我想使用这个add 方法来聚合GameStatistics 的列表,使用Seq 的reduce 方法。
我无法在 Scala 中定义它并使其编译。下面是我尝试的一个示例以及它的编译错误。
这些错误对我来说没有任何意义。我应该如何让它工作?
package bgengine
trait GameStatistics {
def equity: Double
def add[G: this.type](s: G): G
def multiply(x: Double): GameStatistics
}
object GameStatistics {
def aggregate(stats: Seq[GameStatistics]): GameStatistics = stats.reduce( _ add _ )
}
case class SimpleGameStatistics(equity: Double, nrGames: Int) extends GameStatistics {
override def add[G: SimpleGameStatistics](s: G): G =
SimpleGameStatistics((equity * nrGames + s.equity * s.nrGames) / (nrGames + s.nrGames), nrGames + s.nrGames).asInstanceOf[G]
override def multiply(x: Double): SimpleGameStatistics = SimpleGameStatistics(equity * x, nrGames)
}
错误:(6, 12) GameStatistics.this.type 不接受类型参数
def add[G: this.type](s: G): G错误:(17, 21) bgengine.SimpleGameStatistics 不接受类型 参数覆盖 def add[G: SimpleGameStatistics](s: G): G =
错误:(18, 48) 值权益不是类型参数 G 的成员 SimpleGameStatistics((equity * nrGames + s.equity * s.nrGames) / (nrGames + s.nrGames), nrGames + s.nrGames).asInstanceOf[G]
错误:(18, 59) 值 nrGames 不是类型参数 G 的成员 SimpleGameStatistics((equity * nrGames + s.equity * s.nrGames) / (nrGames + s.nrGames), nrGames + s.nrGames).asInstanceOf[G]
错误:(18, 83) 值 nrGames 不是类型参数 G 的成员 SimpleGameStatistics((equity * nrGames + s.equity * s.nrGames) / (nrGames + s.nrGames), nrGames + s.nrGames).asInstanceOf[G]
错误:(18, 105) 值 nrGames 不是类型参数 G 的成员 SimpleGameStatistics((equity * nrGames + s.equity * s.nrGames) / (nrGames + s.nrGames), nrGames + s.nrGames).asInstanceOf[G]
【问题讨论】: