簡體   English   中英

為什么我在課堂上遇到適用性錯誤?

[英]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內容addList<? extends Foo> List<? extends Foo> ,但是您對該對象了解很多; get(int index)確實返回Foo

tl; dr只需使用:

List<Key> keylist;
List<Value> valuelist;

並且您的程序將運行。

進一步閱讀: Canonical Java Generics FAQ,帶有指向有界通配符部分的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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