2017-10-03 13 views
1

ジェネリックでコンパイルに問題があります。 asInstanceOfを使用すると、コードは正常にコンパイルされます。私はasInstanceOfを取り除きたいです。scala - Genericsで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]] 
    } 

私はtempPool.asInstanceOf[F[R]]からasInstanceOfを削除すると、私はこの問題は、この問題の原因は何original.asInstanceOf[mutable.ListBuffer[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 
    

    以下のエラーが出ますか

  • asInstanceOfの使用を避けるにはどうすればよいですか?

おかげ

答えて

3

F[A]と、それだけで∀A∃B F[A] <: ListBuffer[B]ListBuffer[A]の間には関係がありません。これは重要です:

type ConstLBInt[A] = ListBuffer[Int] 
val x: RoundRobin[Resource, ConstLBInt] = ??? // Legal 
// Tries to manipulate ListBuffer[Int]s as if they were ListBuffer[Resources]s 

変更これは∀A F[A] <: ListBuffer[A]を強制

trait RoundRobin[R <: Resource, F[A] <: mutable.ListBuffer[A]] 
//        !      ! 

にあなたのタイプの宣言、例えばようにoverrideMutableResourceListupdated: F[R]は、ListBuffer[R]であることが知られている。

おそらく、これによって簡素化されるクラスの他の部分があります。

関連する問題