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