首页 > 解决方案 > 具有基础类型的类型参数 - Scala

问题描述

假设我有一个特征,它的类型A是 的子类,Any并且调用的方法nextState具有与参数相同的类型。

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

然后这个 trait 被一个Tetris覆盖类型成员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我的类中创建一个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
    }
}

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

类型不匹配 state.type (与基础类型...

从我收集到的情况来看,这是因为编译器不确定是哪种类型state。但是我似乎找不到如何解决我的问题,所以我想知道如何解决这个问题。

标签: scalagenericstypesscala-genericstype-members

解决方案


类型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作为参数。


推荐阅读