Имеем следующий код внутри класса MyClass:
private static Comparator<Map.Entry<?, ?>> comparator = MyClass::compare;
@SuppressWarnings("unchecked")
private static <K,V> int compare(Map.Entry<K, V> me1, Map.Entry<K, V> me2) {
int f = ((Comparable<K>)me1.getKey()).compareTo(me2.getKey());
if (f!=0) return f;
return ((Comparable<V>)me1.getValue()).compareTo(me2.getValue());
}
Вопрос: Можно ли как то избежать прописывания метода compare(me1,me2) как метода класса MyClass так, чтобы иметь что то в следующем роде:
private static Comparator<Map.Entry<?,?>> comparator = (K,V,me1,me2) -> {...};
Было бы здорово заменить токены ? и ? в этой строке на K и V, которые были бы, к примеру, при классе MyClass<K,V>, но non-статическое обращение, разумеется, недоступно. Мне важно оставить поле comparator статическим.
Герберт Шилдт, "Java 8. Полное руководство. Девятое издание." (стр. 446):
Обобщённые функциональные интерфейсы.
Указывать параметры типа в самом лямбда-выражении нельзя. Следовательно, лямбда-выражение не может быть обобщенным.
Значит, без non-статического обращение к type-параметрам класса, содержащего поле comparator, или без явного прописывания метода compare(me1, me2) нельзя создать реализацию желаемого компаратора (который имел бы обобщённый метод compare(...)).
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники