Scala中变量声明中的通用通配符

时间:2009-03-19 16:54:12

标签: java generics scala covariance contravariance

在Java中我可能会这样做:

class MyClass {
    private List<? extends MyInterface> list;

    public void setList(List<MyImpl> l) { list = l; }
}

...当然假设(MyImpl implements MyInterface)。

使用Buffer Scala 的模拟内容是什么?

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

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

2 个答案:

答案 0 :(得分:41)

直接模拟

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

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

与缓冲区相同的处理

要回答您做出的评论,在Java类型参数中始终是不变的,而不是协变的。

答案 1 :(得分:-1)

我根本不确定你理解你的问题(我可能没有足够的咖啡),但听起来你问的是generic classes。如果不是这样,请发表评论或在问题中添加更多信息。我稍后会回来查看。编辑我的答案。