tutorial resueltos reservadas programas palabras ejercicios ejemplos comentarios clases basico java generics scala covariance contravariance

java - resueltos - scala basico



Wildcards genéricos en declaraciones variables en Scala (2)

En Java podría hacer esto:

class MyClass { private List<? extends MyInterface> list; public void setList(List<MyImpl> l) { list = l; } }

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

¿Cuál es el análogo para esto en Scala , cuando se usa 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 de list de tal manera que lo hace?

EDITAR ; Estoy agregando un poco más. La diferencia es obviamente algo que ver con el hecho de que en Java, los genéricos nunca son covariantes en T , mientras que en Scala pueden ser covariantes o no. Por ejemplo, la List clases de Scala es covariante en T (y necesariamente inmutable). Por lo tanto lo siguiente se 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 del compilador ocurre en la declaración de clase:

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

Voy a hacer una pregunta separada ...


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 a un comentario que hizo earler, en Java los parámetros de tipo son siempre invariantes, no covariantes.


No estoy seguro de entender tu pregunta (probablemente no hay suficiente café por mi parte) pero parece que estás preguntando sobre clases genéricas . Si no es así, suelte un comentario o agregue más información a su pregunta. Volveré más tarde y editaré mi respuesta.