Values
是类中的一个内部类HashMap
(见 $ 符号java.util.HashMap$Values
)。
HashMap.values() 方法将返回 Values
未实现List
接口的类对象。也是如此ClassCastException
。
这是Values
HashMap 中的内部私有类,它没有实现List
接口。甚至 AbstractCollection 也没有实现List
接口。
AbstractCollection
实现Collection
接口。所以无法投射到List
.
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();
}
}
更新
以下是 ArrayList 中的构造函数之一。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
所以hashmapObj.values()
方法返回类型是Collection
. 现在哪个类正在实现这个 Collection 接口?答案是Values
HashMap 类(内部类)中的类。from 的返回值hashmapObj.values()
可以传递给上面有效的 ArrayList 构造函数。
即使以下是有效的陈述。
HashMap<String, String> map = new HashMap<String, String>();
Collection c = map.values();
但以下说法不正确
HashMap<String, String> map = new HashMap<String, String>();
List c = map.values(); //compilation error.. return type is not List