【发布时间】:2016-06-01 19:07:23
【问题描述】:
我有以下代码:
HashMap<Integer, String> h = new HashMap<Integer, String>();
h.put(1, "a");
h.put(2, "b");
h.put(3, "c");
h.put(4, "d");
System.out.println(h); //{1=a, 2=b, 3=c, 4=d}
Collection<String> vals = h.values();
System.out.println(vals); //[a, b, c, d]
Iterator<String> itr = vals.iterator();
while (itr.hasNext()) //a b c d
{
System.out.print(itr.next() + " ");
}
我的问题:
h.values()返回h中值的集合视图。既然vals是一个接口,我们怎么给接口赋值(不能实例化)?实现这个接口的类在哪里?该类的对象在哪里?itr的类似问题。我们知道vals.iterator()返回集合的第一个元素。我们如何将它分配给接口实例?
【问题讨论】:
-
“将其分配给接口实例”。听起来这是你的问题。
Collection<String> vals没有声明实例,它声明了对Collection<String>实现的引用。而且由于我们可以实现接口,因此问题不会出现。该实现(通常)在HashMap内部。对于 OpenJDK,它是一个nested class,实现了Collection接口。 -
我刚刚尝试打印
vals.getClass(),它打印了class java.util.HashMap$Values。那么这是否意味着这个类正在实现Collection<String>接口? -
是的,当然。根据定义,如果一个变量是 Collection 类型,那么它引用了一个其类实现了 Collection 的对象。
-
@sam: 没错。例如,OpenJDK 实现扩展了
AbstractCollection,它实现了Collection接口,因此可以分配给该接口的任何(引用)变量。
标签: java collections hashmap iterator