具有基础类型的类型参数 - Scala

type parameter with underlying type in - Scala

假设我有一个类型为 A 的特征,它是 Any 的子 class 和一个名为 nextState 的方法,其类型与一个参数。

trait GameEnvironment {
  type A <: Any
  def nextState(state: A, input: Int): (A, Boolean)
}

此特性随后由一个名为 Tetris 的 class 扩展,它覆盖了类型成员 A 和方法 nextState.

class Tetris extends GameEnvironment {
  override type A = ((Array[Array[Int]]), Int)

  def nextState(state: (Array[Array[Int]], Int), input: Int): 
  ((Array[Array[Int]], Int), Boolean) = {


     ((state, false))
  }
}

现在,在另一个名为 ReinLib 的 class 中,我创建了一个 GameEnvironment,并且我还有一个接受参数 GameEnvironment#A.

的函数
class ReinLib(val mode: String) {
  val env : GameEnvironment = new Tetris()

  def simulateStep(state: GameEnvironment#A, input: Int): (Boolean) = 
    {
       env.nextState(state, input)._2
    }
}

现在,如果我编译这段代码,我会得到一个错误

type mismatch state.type (with underlying type...

据我所知,这是因为编译器不确定 state 具有哪种类型。但是我似乎找不到解决问题的方法,所以我想知道如何解决这个问题。

类型 GameEnvironment#A 太模糊了,它基本上与 env 中使用的状态类型完全无关。

您可能想要这样的东西:

trait GameEnvironment {
  type A
  def nextState(state: A, input: Int): (A, Boolean)
}

class Tetris extends GameEnvironment {
  override type A = ((Array[Array[Int]]), Int)

  def nextState(state: A, input: Int): (A, Boolean) = {
    (state, false)
  }
}

class ReinLib(val mode: String) {
  val env: GameEnvironment = new Tetris()

  def simulateStep(state: env.A, input: Int): Boolean = {
    env.nextState(state, input)._2
  }
}

编译成功,因为现在env.nextState可以接受state: env.A作为参数。