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

Posted

技术标签:

【中文标题】Scala中变量声明中的通用通配符【英文标题】:Generic wildcards in variable declarations in Scala 【发布时间】:2009-03-19 16:54:12 【问题描述】:

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

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

【问题讨论】:

这个问题是否已经回答或仍然开放? 我没注意到你的回答,因为我在这之后不久就去度假了。对不起。我很确定我已经读过“Scala 中没有通配符”。曾经有过这种情况吗?我想现在不是…… 【参考方案1】:

直接模拟

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

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

与缓冲区相同

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

【讨论】:

以上是关于Scala中变量声明中的通用通配符的主要内容,如果未能解决你的问题,请参考以下文章

Scala系统学习:Scala变量

Scala之变量

+- Scala 中的通用声明中的符号

2021年大数据常用语言Scala:基础语法学习 声明变量

scala语言学习基本使用

在 Play2 Scala 模板中声明变量