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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top