Values
est une classe interne dans HashMap
(voir le symbole $ dans java.util.HashMap$Values
).
La méthode HashMap.values() renverra Values
l'objet de la classe qui n'implémente pas List
l'interface. Il en va de même pour l'interface ClassCastException
.
Voici le Values
classe privée interne dans HashMap qui n'implémente pas List
l'interface. Même AbstractCollection n'implémente pas non plus l'interface List
l'interface.
AbstractCollection
met en œuvre Collection
l'interface. Il n'est donc pas possible d'effectuer un casting vers 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();
}
}
Mise à jour
Voici l'un des constructeurs d'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);
}
Donc hashmapObj.values()
Le type de retour de la méthode est Collection
. Quelle est la classe qui implémente l'interface Collection ? La réponse est Values
qui se trouve à l'intérieur de la classe HashMap (classe interne). La valeur renvoyée par hashmapObj.values()
peut être passé au constructeur ArrayList ci-dessus, ce qui est valide.
Même les déclarations suivantes sont valables.
HashMap<String, String> map = new HashMap<String, String>();
Collection c = map.values();
Mais les affirmations suivantes sont incorrectes
HashMap<String, String> map = new HashMap<String, String>();
List c = map.values(); //compilation error.. return type is not List