Domanda

In Java potrei farlo:

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

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

... supponendo che (MyImpl implements MyInterface) ovviamente.

Qual è l'analogo per questo in Scala , quando si utilizza un Buffer?

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

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

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

Questo (ovviamente) non viene compilato, ma come posso dichiarare la variabile list in modo tale da farlo?

Modifica ; Sto aggiungendo un po 'di più. La differenza ha ovviamente a che fare con il fatto che in Java i generici non sono mai covarianti in T , mentre in Scala possono essere o covarianti o no. Ad esempio, la classe Scala List è covariante in T (e necessariamente immutabile). Pertanto verrà compilato il seguente :

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

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

Sto ancora lottando un po 'con l'errore del compilatore:

  

Covariant type T occurs in contravariant position in ...

Ad esempio; questo errore del compilatore si verifica nella dichiarazione di classe:

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

Farò una domanda separata ...

È stato utile?

Soluzione

L'analogo diretto a

import java.util.List;
List<? extends MyInterface> list;

è

import java.util.List
var list : List[_ <: MyInterface]  = _;

Stesso accordo con Buffer

Per rispondere a un commento fatto in precedenza, in Java i parametri di tipo sono sempre invarianti, non covarianti.

Altri suggerimenti

Non sono affatto sicuro di aver capito la tua domanda (probabilmente non abbastanza caffè da parte mia) ma sembra che tu stia chiedendo di classi generiche . In caso contrario, rilascia un commento o aggiungi ulteriori informazioni alla tua domanda & Amp; Controllerò più tardi & Amp; modifica la mia risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top