oxb*_*kes 16 java generics scala covariance contravariance
在Java中我可能会这样做:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
Run Code Online (Sandbox Code Playgroud)
......假设(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
}
}
Run Code Online (Sandbox Code Playgroud)
这(当然)不编译 - 但是如何list以这样的方式声明变量呢?
编辑 ; 我要补充一点.显然,这与Java中的泛型在T中从不协变这一事实有关,而在Scala中,它们可以是协变的,也可以不是协变的.例如,Scala类List在T中是协变的(并且必然是不可变的).因此以下将编译:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然在编译器错误中苦苦挣扎:
Covariant type T occurs in contravariant position in ...
例如; 这个编译器错误发生在类声明中:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Run Code Online (Sandbox Code Playgroud)
我要问一个单独的问题......
Jam*_*Iry 41
直接模拟
import java.util.List;
List<? extends MyInterface> list;
Run Code Online (Sandbox Code Playgroud)
是
import java.util.List
var list : List[_ <: MyInterface] = _;
Run Code Online (Sandbox Code Playgroud)
与Buffer相同
要回答您做出的评论,在Java类型参数中始终是不变的,而不是协变的.
| 归档时间: |
|
| 查看次数: |
12705 次 |
| 最近记录: |