具有基础类型的类型参数 - 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
作为参数。
假设我有一个类型为 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
作为参数。