1

Aのサブクラスである型を持つ特性と、パラメーターと同じ型を持つAnyメソッドが呼び出されたとしましょう。nextState

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

この特性は、型メンバーとメソッドTetrisをオーバーライドするクラスによって拡張されます。AnextState

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を持つかわからないために発生します。しかし、私は自分の問題を解決する方法を見つけることができなかったので、どうすればこれを回避できるのだろうか.

4

1 に答える 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れます。

于 2018-05-14T23:46:14.693 に答える