首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala中变量声明中的泛型通配符

Scala中变量声明中的泛型通配符
EN

Stack Overflow用户
提问于 2009-03-19 16:54:12
回答 1查看 14.7K关注 0票数 19

在Java中,我可能会这样做:

代码语言:javascript
复制
class MyClass {
    private List<? extends MyInterface> list;

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

当然是...assuming (MyImpl implements MyInterface)。

在使用Buffer时,在Scala中与此类似的是什么

代码语言:javascript
复制
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上是协变的(并且必然是不可变的)。因此,下面的将编译

代码语言:javascript
复制
class ScalaClass {
   val list:List[MyInterface]  = null

   def setList(l: List[MyImpl]) = {
     list = l
   }
}

我仍然在为编译器错误而苦苦挣扎:

Covariant type T occurs in contravariant position in ...

例如,这个编译器错误出现在类声明中:

代码语言:javascript
复制
class Wibble[+T] {
  var some: T = _ //COMPILER ERROR HERE!
 }

我要问一个单独的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-23 14:03:33

直接模拟到

代码语言:javascript
复制
import java.util.List;
List<? extends MyInterface> list;

代码语言:javascript
复制
import java.util.List
var list : List[_ <: MyInterface]  = _;

与Buffer的处理相同

为了回答你之前的评论,在Java中,类型参数总是不变的,而不是协变的。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/663032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档