scala - 具有基础类型的类型参数 - 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
。但是我似乎找不到如何解决我的问题,所以我想知道如何解决这个问题。
解决方案
类型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
作为参数。
推荐阅读
- java - 如果在 Spring Boot 中同时出现多个请求,如何保持?
- blueprism - 无法在蓝色棱镜中加载 OTAClient.dll
- c# - 在 LINQ 中搜索列表时性能缓慢
- dart - Flutter-点击照片后如何将相机保持在屏幕上?
- asp.net-core - ASP .NET Core 在添加的每个项目上构建项目,如何禁用
- php - 更新数据透视表laravel 5中的数据
- backbone.js - 在表单提交上确定单击哪个提交按钮操作
- swift - uitableview 填充同样在模拟器中不起作用
- docker - 如何实现滚动更新和关系数据库?
- java - 如何在特定项目上启用/禁用 ListView onItemClickListener?