在Java中,我可能做到这一点:

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

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

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

什么是在模拟此的 Scala的下,使用Buffer当?

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

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

有帮助吗?

解决方案

在直接模

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

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

同样处理用缓冲液

要回答你做早期的版本中,Java类型参数始终不变的评论,不是协变。

其他提示

我不知道在所有我明白你的问题(在我的部分可能没有足够的咖啡),但它听起来像你询问的泛型类的。如果这不是它,掉落的评论或更多的信息,你的问题补充:我以后会回来检查和编辑我的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top