Collection 是一个接口, List是具体的实现. 返回接口的好处是假设以后hasmap内部的实现有改动. api的签名不用变.
不对吧,Collection 是一个接口, List 是继承了Collection 接口的子接口。
这里主要问题是:既然List和Set都是Collection的子接口,而且keySet是Set类型的,那为什么values不是和Set “平级” 的List类型,而是上一级的Collection类型呢?
另外,“假设以后hasmap内部的实现有改动”,您的这句话我还不太理解。
因为 Collection 是一个最上层的集合抽象接口。
1.这样写更加符合依赖倒置原则(Dependence Inversion Principle);你应该是依赖上层的抽象而不是更具体一些的实现接口,好处是调用方依赖的是接口,使得不管你的实现如何改变,调用方都不必跟着改变。
2.因为这个方法是Map接口的方法,使用 Collection 可以给实现类提供更大的操作空间,实现类可以返回Set可以返回List。
感谢答疑,大概懂了。
在jdk8的源码中,HashMap的values方法如下:
public Collection<V> values() {
Collection<V> vs = values;
if (vs == null) {
vs = new Values();
values = vs;
}
return vs;
}
上面代码return的是一个Values对象,且Values类实现了Collection接口。
您的意思是:在Map接口的其他实现类中,values方法return的可能是Set、List、或者其他Collection的子接口(如果有的话),因此才使用Collection来接收返回值,对吧?
@不可为awen: 嗯,差不多是这个意思。