2017-10-03 13 views
1

Je rencontre des problèmes de compilation avec les génériques. Le code compile bien lorsque j'utilise asInstanceOf. Je veux me débarrasser de asInstanceOf.scala - using asInstanceOf avec des génériques

J'ai vu d'autres questions liées à l'utilisation de asInstanceOf, mais je ne m'a pas aidé.

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]] 
    } 

Lorsque je retire la asInstanceOf de tempPool.asInstanceOf[F[R]] je reçois l'erreur ci-dessous

[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 

Ce problème se produit également pour la ligne original.asInstanceOf[mutable.ListBuffer[R]]

  • Quelle est la raison de ce problème?
  • Comment puis-je éviter d'utiliser asInstanceOf?

Merci

Répondre

3

Il n'y a aucun lien entre F[A] et ListBuffer[A], seulement ∀A∃B F[A] <: ListBuffer[B]. Ceci est important:

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

Modifier la déclaration de votre type de

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

Cela force ∀A F[A] <: ListBuffer[A], de sorte que par exemple le updated: F[R] en overrideMutableResourceList est connu pour être un ListBuffer[R].

Il y a probablement d'autres parties de la classe qui seront simplifiées par ceci.