В Java JDK я заметил, что в классе Map есть метод stati c:
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
К моему любопытству, я изменил код на:
public static <K, V extends Comparable<? extends V>> Comparator<Map.Entry<K, V>> comparingByValue() {
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
Компилятор выдает ошибку в этой строке:
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
Ошибка: java: несовместимые типы: V нельзя преобразовать в захват # 1 из? extends V
Возможно, не имеет смысла сравнивать V с объектом его подкласса, но я запутался, почему компилятор выдает ошибку в этом случае? Обобщенные ограниченные шаблоны должны быть включительно, не так ли? Почему компилятор ожидает объект подкласса V в параметре метода compareTo?