scala - 在泛型中使用asInstanceOf

时间:2017-10-03 03:00:41

标签: scala generics casting type-inference

我遇到了泛型的编译问题。当我使用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]]

由于

1 个答案:

答案 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]中的overrideMutableResourceListListBuffer[R]

这个类可能还有其他部分会被简化。

相关问题