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 ...
¿Se ha respondido esta pregunta o todavía está abierta? –
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 ... –