Caractères génériques génériques dans les déclarations de variables à Scala

En Java je pourrais faire ceci:

class MyClass {
    private List<? extends MyInterface> list;

    public void setList(List<MyImpl> l) { list = l; }
}

...en supposant que (MyImpl implements MyInterface) de cours.

Ce qui est de l'analogique dans Scalalors de l'utilisation d'un Buffer?

import java.lang.reflect._
import scala.collection.mutable._

class ScalaClass {
   val list:Buffer[MyInterface]  = null

   def setList(l: Buffer[MyImpl]) = {
     list = l
   }
}

Ce (bien sûr) ne compile pas - mais comment dois-je déclarer la list variable de telle sorte qu'il n'?

MODIFIER; je suis en ajoutant un peu plus. La différence est évidemment quelque chose à voir avec le fait qu'en Java, les génériques sont jamais covariants en Talors que dans Scala ils peuvent être soit covariants ou pas. Par exemple, la Scala de classe List est covariant en T (et forcément immuable). Donc compiler:

class ScalaClass {
   val list:List[MyInterface]  = null

   def setList(l: List[MyImpl]) = {
     list = l
   }
}

Je suis toujours un peu en difficulté avec l'erreur de compilateur:

Covariant type T occurs in contravariant position in ...

Par exemple; cette erreur de compilation se produit dans la déclaration de classe:

class Wibble[+T] {
  var some: T = _ //COMPILER ERROR HERE!
 }

Je vais poser une autre question...

source d'informationauteur oxbow_lakes | 2009-03-19