List<Map<String, String>> vs List<?扩展 Map<String, String>>

2022-08-31 08:27:15

两者之间有什么区别吗?

List<Map<String, String>>

List<? extends Map<String, String>>

?

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


答案 1

不同之处在于,例如,一个

List<HashMap<String,String>>

是一个

List<? extends Map<String,String>>

但不是

List<Map<String,String>>

所以:

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
}

你可能会认为 a of s 应该是 a of s,但有一个很好的理由为什么它不是:ListHashMapListMap

假设你可以做:

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)

所以这就是为什么 a of s 不应该是 a of s 的原因。ListHashMapListMap


答案 2

不能将表达式的类型(如第一个)赋值。List<NavigableMap<String,String>>

(如果你想知道为什么你不能分配看到关于SO的其他问题List<String>List<Object>


推荐