In Java ich dies tun könnte:generische Platzhalter in Variablendeklarationen in Scala
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
... dass (MyImpl implements MyInterface
) natürlich vorausgesetzt.
Was ist das Analog dazu in Scala, wenn Sie eine Buffer
verwenden? Diese
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
(natürlich) nicht kompilieren - aber wie erkläre ich die list
Variable so, dass es funktioniert?
BEARBEITEN; Ich füge ein bisschen mehr hinzu. Der Unterschied ist offensichtlich etwas damit zu tun, dass Generika in Java niemals in T kovariant sind, während sie in Scala entweder kovariant sein können oder nicht. Zum Beispiel ist die Scala-Klasse List
kovariant in T (und notwendigerweise unveränderlich). Daher wird die folgende kompilieren:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
ich noch ein wenig mit dem Compiler-Fehler bin zu kämpfen:
Covariant type T occurs in contravariant position in ...
Zum Beispiel; dieser Compiler-Fehler tritt in der Klassendeklaration:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Ich werde eine andere Frage stellen ...
Wurde diese Frage beantwortet oder ist sie noch offen? –
Ich hatte deine Antwort nicht bemerkt, als ich kurz danach in den Urlaub fuhr. Es tut uns leid. Ich bin mir ziemlich sicher, dass ich gelesen habe, dass es in Scala keine Wildcards gibt. War das jemals der Fall? Ich nehme an, es ist nicht jetzt ... –