以下这种情况:
Map<String, String> map = new HashMap();
Collection coll = map.values();
得到的对象coll, 这时候调用方法的话调用的是哪里的方法?
等号左边是接口,肯定没有具体方法。右边是Map类型调用的方法,根本都没有继承Collection类,肯定不是右边得到的。那么问题来了coll调用的方法到底是哪个类里面实现的。培训的老师也不知道,请大神指教。
------解决思路----------------------
HashMap是一个类,它实现了Map接口,自然实现了接口中的方法,而这个方法返回的是一个Collection接口类型。
coll调用的values()方法是HashMap里面实现的,因为接口里面只是定义,不实现。
------解决思路----------------------
相同的,由于Collection<V>依旧是个接口,它调用的方法依然是子类里的方法
values的返回值是这样一个对象
private final class Values extends AbstractCollection<V> {
public Iterator<V> iterator() {
return newValueIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsValue(o);
}
public void clear() {
HashMap.this.clear();
}
}
里面复写了iterator()
具体详情请查看源码
------解决思路----------------------
public class CollTest {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
System.out.println(map.values().getClass());
}
}
程序输出class java.util.HashMap$Values,也就是说map.values()方法返回的对象的运行时类型是HashMap的内部类Values,而这个内部类Values继承了抽象类AbstractCollection<V>,而抽象类AbstractCollection<E>实现了Collection<E>接口。很常见的3层结构,最上面是接口,中间是抽象类,下面是具体类。