2009-03-19 13 views
16

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

+0

Wurde diese Frage beantwortet oder ist sie noch offen? –

+0

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

Antwort

41

Der direkte Analog

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

ist

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

Same Deal mit Puffer

Kommentar Sie earler, sind in Java-Typ Parametern zu beantworten.

-1

ich gar nicht sicher bin, ich verstehe Ihre Frage (wahrscheinlich nicht genug Kaffee auf meinem Teil), aber es klingt wie Sie fragen über generic classes. Wenn das nicht der Fall ist, hinterlassen Sie einen Kommentar oder fügen Sie weitere Informationen zu Ihrer Frage hinzu & Ich werde später zurückgehen & meine Antwort bearbeiten. immer unveränderlich, nicht covariant

+0

Ich denke, ich verstehe ein bisschen mehr darüber jetzt; Der Unterschied zwischen scala.List und scala.collection.Buffer, der die List ist, ist in seinem Typ kovariant, während Puffer nicht ist. In Java sind Generika * immer * kovariant in T –

+2

Diese Frage sollte ein Kommentar sein. Ich habe dich nicht abgelehnt. – Adrian

Verwandte Themen