powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по использованию генериков
5 сообщений из 5, страница 1 из 1
Вопрос по использованию генериков
    #38842372
eml78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два класса

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class A<K, V> implements E<K, V> {
    public Set<Map.Entry<K, Set<V>>> entrySet() {
        ...
    }
}
public class B<K, V> implements E<K, V> {
    public Set<Map.Entry<K, List<V>>> entrySet() {
        ...
    }
}



Как правильно в интерфейсе E<K, V> описать метод entrySet?

Пробовал так:
Set<Map.Entry<K, Collection<V>>> entrySet();
Получил ошибки типа:
"return type Set<Entry<K#1,Set<V#1>>> is not compatible with Set<Entry<K#1,Collection<V#1>>>"

Еще пробовал так:
Set<Map.Entry<K, ? extends Collection<V>>> entrySet();
Тоже ругается:
"return type Set<Entry<K#1,Set<V#1>>> is not compatible with Set<Entry<K#1,? extends Collection<V#1>>>"
...
Рейтинг: 0 / 0
Вопрос по использованию генериков
    #38842403
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot eml78]Есть два класса

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class A<K, V> implements E<K, V> {
    public Set<Map.Entry<K, Set<V>>> entrySet() {
        ...
    }
}
public class B<K, V> implements E<K, V> {
    public Set<Map.Entry<K, List<V>>> entrySet() {
        ...
    }
}



Как правильно в интерфейсе E<K, V> описать метод entrySet?

Код: sql
1.
<C extends Collection<V>> Set<Map.Entry<K, C>> entrySet();



Интересно, почему не прокатывает просто
Код: sql
1.
Set<Map.Entry<K, ? extends Collection<V>>> entrySet();


а это проходит?
Код: sql
1.
<C extends Collection<V>> Set<Map.Entry<K, ? extends Collection<V>>> entrySet();
...
Рейтинг: 0 / 0
Вопрос по использованию генериков
    #38842411
eml78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а это проходит?
<C extends Collection<V>> Set<Map.Entry<K, ? extends Collection<V>>> entrySet();

Проверил - все нормальн!!!
А почему так?
...
Рейтинг: 0 / 0
Вопрос по использованию генериков
    #38842417
eml78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так <C extends Collection<V>> Set<Map.Entry<K, C>> entrySet(); тоже работает.
...
Рейтинг: 0 / 0
Вопрос по использованию генериков
    #38842527
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eml78Так <C extends Collection<V>> Set<Map.Entry<K, C>> entrySet(); тоже работает.

Ну это-то логично. А C, видимо, помогает компилятору разобраться во всём этом безобразии.

eml78А почему так?

А про что вопрос? ;)
Если про то, зачем вообще нужен extends.

Рассмотрим метод интерфейса вернул
Код: sql
1.
Set<Map.Entry<K, Collection<V>>>


Я могу в возвращённое значение запихнуть ещё одну
Map.Entry<K, Collection<V>>. Причём в качестве значения Entry можно запихнуть любое значение. Логично?

А вот если мне вернут
Код: sql
1.
Set<Map.Entry<K, ? extends Collection<V>>>

то ничего туда вставить нельзя. Потому что я не знаю, какие конкретно value лежат в Entry, и компилятор этого проверить не может (следствие отказа от сохранения типа дженерика).
В результате это путь для возврата коллекций, которые нельзя дополнить (это следствие изначальной ошибки дизайна коллекций в java - надо было делать "Collection extends ReadOnlyCollection", "List extends ReadOnlyList, Collection" и т.п.).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по использованию генериков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]