Caractères génériques génériques dans les déclarations de variable dans Scala
-
20-08-2019 - |
Question
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
) bien sûr.
Quel est l'analogue utilisé dans Scala avec un Buffer
?
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
Ceci (bien sûr) ne compile pas - mais comment déclarer la list
variable de telle sorte qu'elle le fasse?
MODIFIER ; J'en ajoute un peu plus. La différence tient évidemment au fait qu’en Java, les génériques ne sont jamais covariants dans T , alors qu’en Scala, ils peuvent être covariants ou non. Par exemple, la classe de Scala List
est covariante dans T (et nécessairement immuable). Par conséquent, compilera :
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Je suis toujours aux prises avec l'erreur de compilation:
Covariant type T occurs in contravariant position in ...
Par exemple; cette erreur du compilateur se produit dans la déclaration de classe:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Je vais poser une question distincte ...
La solution
L’analogue direct vers
import java.util.List;
List<? extends MyInterface> list;
est
import java.util.List
var list : List[_ <: MyInterface] = _;
Même accord avec Buffer
Pour répondre à un commentaire que vous avez déjà fait, les paramètres de type Java sont toujours invariants et non covariants.
Autres conseils
Je ne suis pas du tout sûr de comprendre votre question (probablement pas assez de café de ma part) mais il semblerait que vous posiez la question à propos de classes génériques . Si ce n'est pas le cas, déposez un commentaire ou ajoutez des informations à votre question & Amp; Je vérifierai plus tard, & Amp; modifier ma réponse.