Type-аргументы в lambda-выражении

275
25 января 2018, 19:18

Имеем следующий код внутри класса 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 статическим.

Answer 1

Герберт Шилдт, "Java 8. Полное руководство. Девятое издание." (стр. 446):

Обобщённые функциональные интерфейсы.

Указывать параметры типа в самом лямбда-выражении нельзя. Следовательно, лямбда-выражение не может быть обобщенным.

Значит, без non-статического обращение к type-параметрам класса, содержащего поле comparator, или без явного прописывания метода compare(me1, me2) нельзя создать реализацию желаемого компаратора (который имел бы обобщённый метод compare(...)).

READ ALSO
Не меняется цвет у компонента JPanel

Не меняется цвет у компонента JPanel

ИтакЕсть класс Window(наследник JFrame), у него такой менеджер компоновки:

255
Использование @PreAuthorize на вложенном методе

Использование @PreAuthorize на вложенном методе

В веб-приложении используется Spring WebMVC и Spring SecurityВозник вопрос, почему не работает аннотация @PreAuthorize, если повесить её на вложенный метод в классе...

354
Как получить данные из Service в класс

Как получить данные из Service в класс

Есть класс который получает данные для фрагмента

285