параметр типа с базовым типом в - Scala - PullRequest
0 голосов
/ 15 мая 2018

Допустим, у меня есть черта с типом 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 имеет. Однако я не могу найти решение своей проблемы, поэтому яинтересно, как можно обойти это.

1 Ответ

0 голосов
/ 15 мая 2018

Тип 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 в качестве параметра.

...