【发布时间】:2016-12-23 16:38:27
【问题描述】:
我尝试设计具有通用多态性的 api
trait GameState {
def doIt(): Unit
}
trait GameMechanics[T <: GameState] {
def stateHolder: StateHolder[T]
}
abstract class AbsGameMechanics[T <: GameState](sh: StateHolder[T]) extends GameMechanics[T] {
override def stateHolder: StateHolder[T] = sh
}
class StateHolder[T <: GameState](var state: T) {
def get: T = state
def set(_state: T): Unit = state = _state
}
所以用户应该扩展GameState 和AbsGameMechanics。 GameMechanics 应该有特定类型的 GameState, DominoMechanics=>DominoGameState
用户介绍新游戏:
class DominoGameState extends GameState {
override def doIt(): Unit = println("domino working!")
}
class DominoMechanics(sh: StateHolder[DominoGameState]) extends AbsGameMechanics[DominoGameState](sh)
val domino = new DominoMechanics(new StateHolder[DominoGameState](new DominoGameState))
在我的系统中,我应该对状态进行多态调用
def internal(gm: GameMechanics[GameState]): Unit = {
gm.stateHolder.get.doIt()
}
它没有编译,我不明白这是什么意思:
internal(domino)
错误:(41, 11) 类型不匹配;发现:A$A133.this.DominoMechanics 必需:A$A133.this.GameMechanics[A$A133.this.GameState] 注意: A$A133.this.DominoStarting <: a trait gamemechanics t>
我做错了什么。什么?
【问题讨论】:
-
搜索“Scala covariance”,这个问题很多。
标签: scala