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 ...

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top