什么是定义Map <String,?>方法参数的正确方法

hyd*_*yde 3 java generics

我有一个自定义的Map to String方法.它适用于任何具有String键的Map,不限于某些特定的map值类型.javax.jms.Message.getObjectProperty(String name)例如,地图值可能来自方法,或者只是简单的字符串.

以下哪一项是最"适当"的方法签名,为什么,或者都是平等的?

String map2String(Map<String, Object> map){...}
Run Code Online (Sandbox Code Playgroud)

要么

String map2String(Map<String, ?> map){...}
Run Code Online (Sandbox Code Playgroud)

要么

String map2String(Map<String, ? extends Object> map){...}
Run Code Online (Sandbox Code Playgroud)

或(添加编辑)

<E> String map2String(Map<String, ? extends E> map){...}
Run Code Online (Sandbox Code Playgroud)

或者是其他东西?

此外,该方法包含for-each循环,如下所示:

for(Entry<String, ?> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue().toString();
}
Run Code Online (Sandbox Code Playgroud)

哪个是entry变量的"正确"类型,是否重要(除了?地图中的不兼容组合,Object在条目类型中).

art*_*tol 5

String map2String(Map<String, ?> map){...}是正确的(? extends Object多余的)

第一个不起作用,因为你无法打电话

Map<String,Integer> myMap = {...}
map2String(myMap); // Map<String,Integer>  is not  Map<String,Object>  
Run Code Online (Sandbox Code Playgroud)

Entry<String, ?>您怀疑输入变量的正确类型.