Values
ist eine innere Klasse in der HashMap
Klasse (siehe $ symbol in java.util.HashMap$Values
).
Die HashMap.values () -Methode gibt Values
das Objekt der Klasse zurück, das keine List
Schnittstelle implementiert . So ist das ClassCastException
.
Hier ist die Values
innere private Klasse in HashMap, die keine List
Schnittstelle implementiert . Auch AbstractCollection implementiert keine List
Schnittstelle.
AbstractCollection
implementiert Collection
Schnittstelle. Also nicht in der Lage zu besetzen 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();
}
}
Aktualisieren
Das Folgende ist einer der Konstruktoren in ArrayList.
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
Der hashmapObj.values()
Methodenrückgabetyp ist also Collection
. Welche Klasse implementiert nun diese Collection-Schnittstelle? Die Antwort ist eine Values
Klasse, die sich innerhalb der HashMap-Klasse (innere Klasse) befindet. Der zurückgegebene Wert von hashmapObj.values()
kann an den obigen ArrayList-Konstruktor übergeben werden, der gültig ist.
Auch das Folgende ist gültige Aussagen.
HashMap<String, String> map = new HashMap<String, String>();
Collection c = map.values();
Die folgenden Aussagen sind jedoch falsch
HashMap<String, String> map = new HashMap<String, String>();
List c = map.values();
values
Methode gibt eine Sammlung zurück, keine Liste.