簡體   English   中英

如何添加對象 <? extends Interface> ?

[英]How can I add an object to <? extends Interface>?

public interface A {
    int getA();
}

public class MyObj implements A {
    public int getA(){
        return 1;
    }
}

如果有地圖: Map<? extends A, String> aMap = new HashMap<>(); Map<? extends A, String> aMap = new HashMap<>();

我如何添加一個MyObj這個aMap 或者MyObj類應該如何才能在這個地圖中工作

如何將MyObj添加到此aMap

你不能,因為鍵類型的上限。

原因是? extends A ? extends A可以是MyOtherObj implements A 在這種情況下,能夠將MyObj類型的MyObj放入映射中將是類型不安全的:

Map<MyOtherObj, String> anotherMap = new HashMap<>();

Map<? extends A, String> aMap = anotherMap;
aMap.put(new MyObj(), "");  // Can't do this; but if you could...

MyOtherObj obj = anotherMap.keySet().iterator().next();  // ClassCastException!

記住首字母縮略詞PECS(更多細節請參閱此問題 ):

  • 制片人extends
  • 消費者super

換句話說, Map<? extends A, String> Map<? extends A, String>只能用於生成 A實例,它不能使用/接受A實例。

例如,您可以迭代鍵(“生成”鍵):

for (A a : aMap.keySet()) { ... }

地圖只能“消耗”文字null

aMap.put(null, "");

因為null可以毫無例外地轉換為任何類型。 但是在只有一個鍵的地圖中沒有太多用處 - 您也可以直接存儲該值。

要做到這一點的唯一方法類型安全是把實例MyObj成通過它,你知道的參考地圖接受MyObj的實例:

Map<MyObj, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map<? extends A, String> aMap = safeMap;

要么

Map<A, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map<? extends A, String> aMap = safeMap;

但你應該考慮根本沒有通配符類型的地圖; Map<MyObj, String>Map<A, String>更容易。

這是不可能的。 您的編譯器不允許它。

您必須將地圖更改為:

Map<A, String> aMap = new HashMap<>();

在此之后,您可以使用put向其添加元素:

aMap.put(new MyObj(), "myObject");

暫無
暫無

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

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