2009-03-19 19 views
16

En Java podría hacer esto:comodines genéricos en las declaraciones de variables en Scala

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

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

... suponiendo que (MyImpl implements MyInterface) por supuesto.

¿Cuál es el analógico para esto en Scala, cuando se utiliza un Buffer?

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

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

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

Este (por supuesto) no se compila - pero ¿cómo puedo declarar la variable list de tal manera que lo hace?

EDIT; Estoy agregando un poco más. La diferencia obviamente tiene que ver con el hecho de que en Java, los genéricos son nunca covariantes en T, mientras que en Scala pueden ser covariantes o no. Por ejemplo, la clase Scala List es covariante en T (y necesariamente inmutable). Por lo tanto el siguiente compilará:

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

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

Todavía estoy luchando un poco con el error del compilador:

Covariant type T occurs in contravariant position in ...

Por ejemplo; este error de compilación se produce en la declaración de clase:

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

voy a hacer una pregunta separada ...

+0

¿Se ha respondido esta pregunta o todavía está abierta? –

+0

No había notado su respuesta ya que me fui de vacaciones poco después de esto. Lo siento. Estoy bastante seguro de haber leído que "no había comodines en Scala". ¿Fue este el caso? Supongo que no es ahora ... –

Respuesta

41

El análogo directo a

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

es

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

Lo mismo pasa con Tampón

Para responder a un comentario que hizo earler, en parámetros de tipo Java son siempre invariable, no covariante.

-1

no estoy seguro en absoluto entiendo su pregunta (probablemente no es suficiente café en mi parte) pero parece que estás preguntando por generic classes. Si no es así, deje un comentario o agregue más información a su pregunta & Volveré más tarde & para editar mi respuesta.

+0

Creo que entiendo un poco más sobre eso ahora; la diferencia entre scala.List y scala.collection.Buffer es que la lista es covariante en su tipo, mientras que Buffer no lo es. En Java, los genéricos son * siempre * covariantes en T –

+2

. Esta pregunta debería haber sido un comentario. No te voté. – Adrian

Cuestiones relacionadas