exemple:Comment instancier une instance de type représenté par le paramètre de type à Scala
import scala.actors._
import Actor._
class BalanceActor[T <: Actor] extends Actor {
val workers: Int = 10
private lazy val actors = new Array[T](workers)
override def start() = {
for (i <- 0 to (workers - 1)) {
// error below: classtype required but T found
actors(i) = new T
actors(i).start
}
super.start()
}
// error below: method mailboxSize cannot be accessed in T
def workerMailboxSizes: List[Int] = (actors map (_.mailboxSize)).toList
.
.
.
Notez la deuxième erreur montre qu'il connaît les éléments de l'acteur sont « T » s, mais pas que le « T » est une sous-classe d'acteur, comme contrainte dans la définition générique de la classe.
Comment ce code corriger au travail (en utilisant Scala 2.8)?
... j'ai oublié de mentionner, j'utilise le plugin Eclipse Scala (2.8 tous les soirs) pour cela ... –
Toujours l'erreur sur "méthode mailboxSize n'est pas accessible en T", malgré l'utilisation du fac () funtion transmis comme vous l'avez suggéré. Je suis surpris par ce résultat, puisque le compilateur sait que T est <: Acteur, et que Acteur a le .mailboxSize (accédé dans la même classe de BalanceActor, comme montré) Je me demande s'il s'agit d'un bug dans la version en question de 2,8 tous les soirs j'utilise ??? Ne devrait pas l'accès à la compilation .mailboxSize, comme vous l'avez déclaré vous-même? Avez-vous quelque chose de similaire au travail, peut-être sur le plugin Eclipse 2.7.5.final, ou sur la compilation Scalac autonome? –
Merci à la fois oxbow_lakes et Walter Chang pour fournir des solutions différentes, mais à la fois réalisables, pour le problème d'instanciation. –