首页 文章

带底层类型的类型参数 - Scala

提问于
浏览
1

假设我有一个 A 类型的特征,它是 Any 的子类,还有一个名为 nextState 的方法,它与参数具有相同的类型 .

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

然后通过名为 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
    }
}

现在,如果我编译此代码,我会收到错误

type mismatch state.type(带底层类型......

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

1 回答

  • 0

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

相关问题