在斯卡拉变量声明通用通配符
-
20-08-2019 - |
题
在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类型参数始终不变的评论,不是协变。
其他提示
我不知道在所有我明白你的问题(在我的部分可能没有足够的咖啡),但它听起来像你询问的泛型类的。如果这不是它,掉落的评论或更多的信息,你的问题补充:我以后会回来检查和编辑我的答案。
不隶属于 StackOverflow