簡體   English   中英

Scala中變量聲明中的通用通配符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM