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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top