2009-03-19 14 views
16

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

+0

Questa domanda ha avuto risposta o è ancora aperta? –

+0

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

risposta

41

L'analogico diretto a

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

è

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

Stessa cosa con tampone

Per rispondere a un commento che hai fatto earler, a parametri di tipo Java sono sempre invarianti, non covariante.

-1

non sono sicuro affatto ho capito la tua domanda (probabilmente non abbastanza caffè sulla mia parte) ma sembra che tu stia chiedendo di generic classes. Se non è questo, lascia un commento o aggiungi ulteriori informazioni alla tua domanda & Ricontrollo più tardi & modifica la mia risposta.

+0

Penso di capire un po 'di più adesso; la differenza tra scala.List e scala.collection.Buffer essendo la lista è covariante nel suo tipo mentre Buffer non lo è. In Java, i generici sono * sempre * covarianti in T –

+2

Questa domanda avrebbe dovuto essere un commento. Non ti ho votato. – Adrian

Problemi correlati