caracteres universais genérica em declarações de variáveis ??em Scala
-
20-08-2019 - |
Pergunta
Em Java eu ??poderia 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 análogo para isso em Scala , ao usar um Buffer
?
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
Este (é claro) não compilar - mas como faço para declarar a variável list
de tal maneira que ele faz
Editar ; Eu estou adicionando um mais pouco. A diferença é, obviamente, algo a ver com o fato de que em Java, os genéricos são não covariante em T , enquanto que em Scala podem ser covariante ou não. Por exemplo, a classe List
Scala é covariante em T (e necessariamente imutável). Por isso, a seguinte irá compilar :
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Eu 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 da classe:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Eu vou fazer uma pergunta separada ...
Solução
O análogo direto para
import java.util.List;
List<? extends MyInterface> list;
é
import java.util.List
var list : List[_ <: MyInterface] = _;
A mesma coisa com Tampão
Para responder a um comentário que você fez earler, em parâmetros de tipo Java são sempre invariável, não covariante.
Outras dicas
Eu não tenho certeza que em tudo o que eu entendi sua pergunta (provavelmente não o suficiente café da minha parte), mas parece que você está perguntando sobre classes genéricas . Se não é isso, soltar um comentário ou adicionar mais informações à sua pergunta e eu vou voltar mais tarde e editar a minha resposta.