Valuesclass の内部クラスですHashMap( の $ 記号を参照java.util.HashMap$Values)。
HashMap.values() メソッドは 、インターフェイスValuesを実装していないクラスのオブジェクトを返しListます。もそうですClassCastException。 これは、インターフェイスを実装していない HashMap
の内部プライベート クラスです。AbstractCollection もインターフェイスを実装していません。インターフェイスを実装します。そのため、 にキャストできません。ValuesListList
AbstractCollectionCollectionList
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 のコンストラクターの 1 つです。
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クラス(インナークラス)の中にあるクラスです。からの戻り値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