设计多态类尝试设计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)
Error:(41, 11) type mismatch; found : A$A133.this.DominoMechanics required: A$A133.this.GameMechanics[A$A133.this.GameState] Note: A$A133.this.DominoStarting <: A$A133.this.GameState (and A$A133.this.DominoMechanics <: A$A133.this.AbsGameMechanics[A$A133.this.DominoStarting]), but trait GameMechanics is invariant in type T. You may wish to define T as +T instead. (SLS 4.5) internal(domino) ^
我做错了什么。什么?
搜索“斯卡拉协变”,有很多关于这方面的问题。 –