Общие подстановочные знаки в объявлениях переменных в Scala

В 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!
 }

Собираюсь задать отдельный вопрос ...


person oxbow_lakes    schedule 19.03.2009    source источник
comment
На этот вопрос ответили или он все еще открыт?   -  person James Iry    schedule 18.06.2009
comment
Я не заметил вашего ответа, так как вскоре после этого уехал в отпуск. Прости. Я почти уверен, что читал, что в Scala нет подстановочных знаков. Было ли это когда-нибудь так? Полагаю, это не сейчас ...   -  person oxbow_lakes    schedule 18.06.2009


Ответы (1)


Прямой аналог

import java.util.List;
List<? extends MyInterface> list;

is

import java.util.List
var list : List[_ <: MyInterface]  = _;

То же самое и с Buffer

Чтобы ответить на комментарий, сделанный ранее, в Java параметры типа всегда инвариантны, а не ковариантны.

person James Iry    schedule 23.03.2009