我遇到了泛型的编译问题。当我使用monotonically_increasing_id
时,代码编译得很好。我想摆脱asInstanceOf
。
我看到了一些与asInstanceOf
的使用相关的其他问题,但我没有帮助我。
asInstanceOf
当我从trait RoundRobin[R <: Resource, F[_] <: mutable.ListBuffer[_]] {
self: RoundRobin[R, F] =>
// some public functions
private def overrideMutableResourceList(original: F[R], updated: F[R]): F[R] = {
val tempPool = original.asInstanceOf[mutable.ListBuffer[R]]
original.indices.foreach(i => {
val e = updated(i).asInstanceOf[R]
tempPool.update(i, e)
})
tempPool.asInstanceOf[F[R]]
}
移除asInstanceOf
时,我收到以下错误
tempPool.asInstanceOf[F[R]]
此问题也适用于行[error] /Users/...../RoundRobin.scala:108: type mismatch;
[error] found : tempPool.type (with underlying type scala.collection.mutable.ListBuffer[R])
[error] required: F[R]
[error] tempPool
[error] ^
[error] one error found
[error] (clustering/compile:compileIncremental) Compilation failed
[error] Total time: 3 s, completed Oct 3, 2017 2:53:34 AM
original.asInstanceOf[mutable.ListBuffer[R]]
?由于
答案 0 :(得分:3)
F[A]
和ListBuffer[A]
之间没有任何关系,只有∀A∃B F[A] <: ListBuffer[B]
。这很重要:
type ConstLBInt[A] = ListBuffer[Int]
val x: RoundRobin[Resource, ConstLBInt] = ??? // Legal
// Tries to manipulate ListBuffer[Int]s as if they were ListBuffer[Resources]s
将类型声明更改为
trait RoundRobin[R <: Resource, F[A] <: mutable.ListBuffer[A]]
// ! !
这会强制∀A F[A] <: ListBuffer[A]
,例如已知updated: F[R]
中的overrideMutableResourceList
为ListBuffer[R]
。
这个类可能还有其他部分会被简化。