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
Vous devez vous connecter pour publier un commentaire.
L'analogique directe à
est
Même chose avec Tampon
Pour répondre à un commentaire que vous faites correspondante, en Java, le type de paramètres sont toujours invariant, pas covariante.
Je ne suis pas sûr du tout que je comprends de votre question (sans doute pas assez de café de ma part), mais il semble que vous vous posez à propos de les classes génériques. Si ce n'est pas ça, déposer un commentaire ou ajouter plus d'informations à votre question & je vais vérifier à nouveau plus tard & modifier ma réponse.