В Java я мог бы сделать это:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
... при условии, что (MyImpl implements MyInterface
), конечно.
Какой аналог этого есть в Scala при использовании Buffer
?
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
Это (конечно) не компилируется, но как мне объявить переменную list
таким образом, чтобы это произошло?
РЕДАКТИРОВАТЬ; Я добавляю еще немного. Разница, очевидно, связана с тем фактом, что в Java универсальные шаблоны никогда не являются ковариантными в T, тогда как в Scala они могут быть либо ковариантными, либо нет. Например, класс Scala List
ковариантен в T (и обязательно неизменяем). Поэтому следующий будет компилироваться:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Я все еще немного борюсь с ошибкой компилятора:
Covariant type T occurs in contravariant position in ...
Например; эта ошибка компилятора возникает в объявлении класса:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Собираюсь задать отдельный вопрос ...