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 类在 T 中是协变的(并且必然是不可变的)。因此,将编译以下内容:List

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

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


答案 1

直接模拟

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

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

与缓冲区相同的交易

为了回答您所做的注释,在Java中,类型参数始终是不变的,而不是协变的。


答案 2

推荐