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中变量声明中的通用通配符的主要内容,如果未能解决你的问题,请参考以下文章