В задаче есть HashMap grades, методы которого (keySet и values) возвращают коллекции типа Set и типа Collection, однако если в задаче
явно создать коллекции
Set<String> keys = grades.keySet();
Collection<Double> value = grades.values();
Компилятор выдаст ошибку т.к. ни Set ни Collection не подключены.
Тогда как в задаче в цикле мы возвращаем Set и Collection через методы HashMap?
И как тогда компилятор понимает как работать с этими значениями?
for (String key: grades.keySet())
{
Integer value = grades.get(key);
System.out.println(value);
}
Простите если слишком сложно объяснил, старался как мог
Синяя Собаченка
26 уровень
Вызов метода с возвратом значений неподключенного класса
Обсуждается
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Синяя Собаченка
21 сентября 2022, 13:56
Спасибо, стало чуть понятней)
0
KIRAРазработчик в prosv.ruExpert
20 сентября 2022, 19:55
Метод keySet() - возвращает Set (объект класса KeySet который внутри HashMap)
Set наследник Collection
Collection наследник Iterable
в интерфейсе Iterable объявлен итератор
итератор внутри HashMap инициализируется классом KeyIterator (класс внутри HashMap)
Убедиться в этом вы можете так
Получите
KeyIterator наследник HashIterator
В классе HashIterator описана работа методов итератор: nextNode(), hasNext() ...
Что касается цикла в стиле for each - это синтаксический сахар который скрывает от нас работу с итератором.
+2
Андрей Столяров
20 сентября 2022, 19:14
Хмм, отличный вопрос. Предположу, что когда мы создаем Set<String> keys = grades.keySet();
Мы создаем новый объект в виде полноценной коллекции с ее классом Set и методами, а когда мы вызываем grades.keySet(); мы используем метод, который принадлежит классу Map и возвращаем значение в виде Set, благодаря тому, что он был импортирован в классе Map.
Могу ошибаться, подождем знатоков.
По крайней мере в описании к методу keySet такой инфы нет:
Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
Returns:
a set view of the keys contained in this map
+1