In Java potrei farlo:jolly generici in dichiarazioni di variabili a Scala
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
... assumendo che (MyImpl implements MyInterface
) naturalmente.
Qual è l'analogico per questo in Scala, quando si utilizza uno 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 compila - ma come faccio a dichiarare la variabile list
in modo tale che lo fa?
MODIFICA; Sto aggiungendo un po 'di più. La differenza è ovviamente qualcosa a che fare con il fatto che in Java i generici sono mai covarianti in T, mentre in Scala possono essere sia covarianti che non. Ad esempio, la classe Scala List
è covariante in T (e necessariamente immutabile). Pertanto il seguente compilerà:
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 ...
Per esempio; questo errore di compilazione si verifica nella dichiarazione della classe:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
ho intenzione di fare una domanda separata ...
Questa domanda ha avuto risposta o è ancora aperta? –
Non avevo notato la tua risposta mentre andavo in vacanza poco dopo. Scusate. Sono abbastanza sicuro di aver letto che non c'erano "caratteri jolly in Scala". E 'mai stato così? Suppongo che non sia ora ... –