19

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

我要问一个单独的问题...

4

1 回答 1

44

直接模拟

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

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

同样处理 Buffer

要回答您之前发表的评论,Java 类型参数始终是不变的,而不是协变的。

于 2009-03-23T14:03:33.483 回答