首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >List<Map<String,String>> vs List<?扩展Map<String、String>>

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

Stack Overflow用户
提问于 2012-03-22 02:15:20
回答 2查看 124.9K关注 0票数 129

两者之间有什么区别吗?

代码语言:javascript
复制
List<Map<String, String>>

代码语言:javascript
复制
List<? extends Map<String, String>>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-22 02:18:45

不同之处在于,例如,

代码语言:javascript
复制
List<HashMap<String,String>>

是一个

代码语言:javascript
复制
List<? extends Map<String,String>>

但不是

代码语言:javascript
复制
List<Map<String,String>>

所以:

代码语言:javascript
复制
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 List of HashMaps应该是a List of Maps,但有一个很好的理由证明它不是:

假设你可以这样做:

代码语言:javascript
复制
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 List of HashMaps不应该是List of Maps的原因。

票数 181
EN

Stack Overflow用户

发布于 2012-03-22 23:32:41

今天,我已经使用了这个功能,所以这是我非常新鲜的现实生活中的例子。(我已经将类和方法名称更改为泛型名称,这样它们就不会分散对实际问题的注意力。)

我有一个方法,用于接受我最初使用此签名编写的A对象的Set

代码语言:javascript
复制
void myMethod(Set<A> set)

但它实际上想用A的子类的Set来调用它。但这是不允许的!(这样做的原因是,myMethod可以向set添加类型为A的对象,但不是set的对象在调用方站点声明的子类型。因此,如果可能的话,这可能会破坏类型系统。)

现在来看一下泛型,因为如果我使用这个方法签名,它就能正常工作:

代码语言:javascript
复制
<T extends A> void myMethod(Set<T> set)

或者更短一些,如果你不需要在方法体中使用实际的类型:

代码语言:javascript
复制
void myMethod(Set<? extends A> set)

这样,set的类型就变成了A的实际子类型的对象集合,因此可以在子类中使用它,而不会危及类型系统。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9810445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档