簡體   English   中英

Java泛型放在地圖上 <String, ? extends List<String> &gt;

[英]Java Generics putting on Map<String, ? extends List<String>>

有沒有辦法以類型安全的方式進行以下實現?

public void myMethod( Map<String, ? extends List<String>> map )
{
   map.put("foo", Collections.singletonList("bar");
}

上述實現不起作用。 它需要Map<String, ? super List<String>> Map<String, ? super List<String>>正確編譯方法map.put() 但myMethod不會以這種方式接受List的任何子類型。 所以,我必須使用Map<String, ? extends List<String>> Map<String, ? extends List<String>> 如何以類型安全的方式解決此問題?

public void myMethod( Map<String, List<String>> map ) {
    map.put("foo", Collections.singletonList("bar") );
}

你不能把一個List (返回類型的Collections.singletonList()Map? extends List ,因為實際的類型可能是任何實現List 。例如,它是不是安全的把一個普通的ListMap<String,LinkedList>因為List可能不是LinkedList 。但是,我們可以輕松地將LinkedList放入<String,List>Map中。

我想你已經在考慮你的仿制葯了。 你不必使用? extends ? extends為非泛型類。 例如, List<Object>將持有的任何Object ,則? extends 不需要? extends來添加對象。 List<List<Foo>>只接受List<Foo>對象而不是List<FooSubclass>對象[通用類不會根據它們的參數繼承]。 這是哪里? extends ? extends發揮作用。 要將List<Foo>List<FooSubclass>List ,類型必須是List<List<? extends Foo>> List<List<? extends Foo>>

Map<String, List<String>不會工作嗎? 有什么特別的原因你必須在那里有一個通配符嗎?

將Collections和Generics一起使用時,有一個非常簡單的原則。 它被稱為“獲取和放置原則”:

當你只從集合中獲取值時使用“擴展”通配符,當你只將PUT值放入集合時使用“超級”通配符,當你想要get和put時不使用任何通配符。

所以,正如你所看到的,根據這個原則,最初的例子是無效的。

想象一下,如果有人傳給你一個Map<String, ArrayList<String>> 您輸入的值是Collections.singletonList的結果,它不是 ArrayList

您不能接受Map中任何List的子類型,然后期望能夠添加您自己的,可能不兼容的子類型。

暫無
暫無

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

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