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;
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();
valuesМетод повертає колекцію, а НЕ список.