【问题标题】:Generic wildcards in variable declarations in ScalaScala中变量声明中的通用通配符
【发布时间】: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 中没有通配符”。曾经有过这种情况吗?我想现在不是……

标签: java generics scala covariance contravariance


【解决方案1】:

直接模拟

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

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

与缓冲区相同

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

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2014-06-26
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多