Comodines genéricos en declaraciones variables en Scala
-
20-08-2019 - |
Pregunta
En Java podría hacer esto:
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 análogo 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
}
}
Esto (por supuesto) no se compila, pero ¿cómo declaro la variable list
de tal manera que lo haga?
EDITAR ; Estoy agregando un poco más. La diferencia obviamente tiene algo 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, los siguientes compilarán :
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 del compilador ocurre en la declaración de clase:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Voy a hacer una pregunta por separado ...
Solución
El análogo directo a
import java.util.List;
List<? extends MyInterface> list;
es
import java.util.List
var list : List[_ <: MyInterface] = _;
Mismo trato con Buffer
Para responder un comentario que hizo antes, en Java los parámetros de tipo son siempre invariantes, no covariantes.
Otros consejos
No estoy seguro de nada, entiendo tu pregunta (probablemente no hay suficiente café de mi parte) pero parece que estás preguntando sobre clases genéricas . Si no es así, deje un comentario o agregue más información a su pregunta & Amp; Volveré más tarde & Amp; edite mi respuesta.