关于java:List< Map< String,String>>

List<Map<String, String>> vs List<? extends Map<String, String>>

两者有什么区别吗

1
List<Map<String, String>>

1
List<? extends Map<String, String>>

如果没有区别,使用? extends有什么好处?


区别在于,例如,

1
List<HashMap<String,String>>

是一个

1
List<? extends Map<String,String>>

但不是

1
List<Map<String,String>>

所以:

1
2
3
4
5
6
7
8
9
void withWilds( List<? extends Map<String,String>> foo ){}
void noWilds( List<Map<String,String>> foo ){}

void main( String[] args ){
    List<HashMap<String,String>> myMap;

    withWilds( myMap ); // Works
    noWilds( myMap ); // Compiler error
}

你会认为HashMaps的List应该是Maps的List,但这是有充分理由的:

假设你能做到:

1
2
3
4
5
6
7
8
9
10
11
12
List<HashMap<String,String>> hashMaps = new ArrayList<HashMap<String,String>>();

List<Map<String,String>> maps = hashMaps; // Won't compile,
                                          // but imagine that it could

Map<String,String> aMap = Collections.singletonMap("foo","bar"); // Not a HashMap

maps.add( aMap ); // Perfectly legal (adding a Map to a List of Maps)

// But maps and hashMaps are the same object, so this should be the same as

hashMaps.add( aMap ); // Should be illegal (aMap is not a HashMap)

这就是为什么HashMapList不应该是MapList的原因。


不能将类型为List>的表达式赋给第一个。

(如果你想知道为什么你不能把List分配给List,请看无数其他问题。)