Задать вопрос
@Feor_slen

Странное поведение с дженериками и T extends of Comparable. Как правильно сохранить тип T не получив *?

У меня есть функция для сортировки которой надо выдать лямбду возвращающую T extends Comparable. Допустим она как то так выглядит

public <T extends Comparable<? super T>> void sortItems(Function<Map.Entry<Described, Item>, T> sortKeyExtractor, OrderType order) {
        List<Map.Entry<Described, Item>> sorted = list.entrySet().stream()
                .sorted(Comparator.comparing(sortKeyExtractor))
                .collect(Collectors.toList());

        if (order == OrderType.REVERSE)
            Collections.reverse(sorted);

        replaceList(sorted);
    }


При попытке в ней заменить T на * я получаю ошибку сборки, что в целом понятно хоть и смутно. Проблема не совсем в ней: есть внешняя модалка которая хранит в себе несколько лямбд в формате

List<SortType<*>> = emptyList()

//где SortType скучный дата класс:

data class SortType<T : Comparable<T>> (
    val sortName: String,
    val fetcher: (Map.Entry<Described, Item>) -> T
)


А сейчас вопрос почему передача в метод любого объекта коллекции c Comparable<*> это норм, а надстройка с враппером:

val nullableComparatorWrapper =
            if (sortState.selectedSortType == null)
                SortType.emptySortType.fetcher
            else
                sortState.selectedSortType!!.fetcher


внезапно не норм??? Почему только так вылезает тип Comporator<*> (который изначально объявлен) и приходится искать обходные пути чтобы таки впихнуть эту пустую лямбду (не совсем она 0 возвращает) в код?

Знаю что по хорошему надо поменять подход потому что передача пустышки в сортер вызывает недоумение мол зачем, но вопрос то всё равно остаётся...
  • Вопрос задан
  • 41 просмотр
Подписаться 2 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Android-разработчик с нуля
    14 месяцев
    Далее
  • Академия Eduson
    Android-разработчик
    6 месяцев
    Далее
  • Stepik
    Kotlin JVM – курс для начинающих
    2 недели
    Далее
Пригласить эксперта
Ответы на вопрос 1
@Feor_slen Автор вопроса
upd:
проблему я решил убрав nullable состояние, по дефолту присвоив\переприсвваивая emptySortType. Теперь IDE не ругается и все работает. (никакого рефакторинга здесь не буде)

Но всё таки почему? Почему SortType<*> для T не вызывает ошибки Comparable<*>?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы