Java Scala中变量声明中的通用通配符
在Java中,我可以这样做:Java Scala中变量声明中的通用通配符,java,generics,scala,covariance,contravariance,Java,Generics,Scala,Covariance,Contravariance,在Java中,我可以这样做: class MyClass { private List<? extends MyInterface> list; public void setList(List<MyImpl> l) { list = l; } } 这(当然)不会编译-但是如何以这样的方式声明list变量呢 编辑;我再加一点。这种差异显然与以下事实有关:在Java中,泛型在T中从来都不是协变的,而在Scala中它们可以是协变的,也可以不是协变的。例如,
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
这(当然)不会编译-但是如何以这样的方式声明list
变量呢
编辑;我再加一点。这种差异显然与以下事实有关:在Java中,泛型在T中从来都不是协变的,而在Scala中它们可以是协变的,也可以不是协变的。例如,Scala类列表在T中是协变的(并且必然是不可变的)。因此,将编译以下:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
我仍然有点纠结于编译器错误:
协变类型T出现在…的逆变位置。
比如,;类声明中出现此编译器错误:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
我要问一个单独的问题…直接模拟到
import java.util.List;
List<? extends MyInterface> list;
import java.util.List;
列表这个问题已经回答了还是还没有回答?我没有注意到你的回答,因为我不久就去度假了。很抱歉我很确定我读过“Scala中没有通配符”。曾经是这样吗?我想不是现在。。。
import java.util.List;
List<? extends MyInterface> list;
import java.util.List
var list : List[_ <: MyInterface] = _;