uringas genéricos em declarações variáveis no Sca
Em Java eu devo fazer isso:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
...assumindo que MyImpl implements MyInterface
) claro
O que é o analógico para isso em Scala, ao usar umBuffer
?
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
Isso (é claro) não compila - mas como declaro olist
variável de tal maneira que funcion
EDITA; Estou adicionando um pouco mais. A diferença está obviamente relacionada ao fato de que, em Java, os genéricos são nunca covariante em T, enquanto que em Scala eles podem ser covariantes ou não. Por exemplo, a classe ScalaList
é covariante em T (e necessariamente imutável). Portanto, o seguintewill compile:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Ainda estou lutando um pouco com o erro do compilador:
Covariant type T occurs in contravariant position in ...
Por exemplo; este erro do compilador ocorre na declaração de classe:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Vou fazer uma pergunta separada ...