[英]Generic wildcards in variable declarations in Scala
在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!
}
我要問一個單獨的問題......
直接模擬
import java.util.List;
List<? extends MyInterface> list;
是
import java.util.List
var list : List[_ <: MyInterface] = _;
與Buffer相同
要回答您做出的評論,在Java類型參數中始終是不變的,而不是協變的。
我根本不確定你理解你的問題(我可能沒有足夠的咖啡),但聽起來你問的是通用課程 。 如果不是這樣,請發表評論或在問題中添加更多信息,我會稍后再回來查看並編輯我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.