Общие шаблоны в объявлениях переменных в Scala - PullRequest
16 голосов
/ 19 марта 2009

В 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 таким образом, что она делает?

EDIT ; Я добавляю немного больше. Разница, очевидно, связана с тем, что в 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!
 }

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

Ответы [ 2 ]

41 голосов
/ 23 марта 2009

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

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

это

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

То же самое дело с буфером

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

0 голосов
/ 19 марта 2009

Я совсем не уверен, что понимаю ваш вопрос (возможно, мне не хватает кофе), но, похоже, вы спрашиваете о общих классах Если это не так, оставьте комментарий или добавьте дополнительную информацию к своему вопросу, и я проверю позже и отредактирую свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...