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