У меня есть функция для сортировки которой надо выдать лямбду возвращающую 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 возвращает) в код?
Знаю что по хорошему надо поменять подход потому что передача пустышки в сортер вызывает недоумение мол зачем, но вопрос то всё равно остаётся...