[英]Why am I getting a capture-of applicability error in my class?
我寫了以下代碼:
public class HashMapImpl<Key,Value>{
Key key;
Value value;
List<? extends Key> keylist;
List<? extends Value> valuelist;
public HashMapImpl(Key k,Value v){
this.key = k;
this.value = v;
keylist = new ArrayList<Key>();
valuelist = new ArrayList<Value>();
}
public Value put(Key k, Value v){
this.keylist.add(k);
}
}
我在add()
上收到此錯誤:
List<capture#3-of ? extends Key>
類型的方法add(capture#3-of ? extends Key)
List<capture#3-of ? extends Key>
不適用於參數(Key
)
為什么會這樣呢? 我該如何解決?
沒有理由使用? extends Key
在此用例中? extends Key
; 該語法適用於可能更具限制性的列表類型,但不一定比Key
更具限制性 。 因為編譯器不知道它只是一個List<Key>
,所以不允許您添加Key
,因為這種情況下,列表的泛型*恰好比Key
具有更嚴格的限制。
考慮它的一種方法是,對於Collection
:
List<? super Foo>
add
內容很容易List<? super Foo>
List<? super Foo>
,但是您對該對象了解不多; get(int index)
返回一個Object
,而不是Foo
。 add
內容add
到List<? extends Foo>
List<? extends Foo>
,但是您對該對象了解很多; get(int index)
確實返回Foo
。 tl; dr只需使用:
List<Key> keylist;
List<Value> valuelist;
並且您的程序將運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.