У меня есть задача, нужно сделать фильтры для стримов с разными типами объектов.
Была идея сделать что-то типо такого:
private static <T> Predicate<? super CategoryStatisticsDto> byDateTo(Date dateTo) {
return t -> t.getPurchaseDate() != null && dateTo.after(t.getPurchaseDate());
}
private static <T> Predicate<? super Basket> byDateTo(Date dateTo) {
return t -> t.getPurchaseDate() != null && dateTo.after(t.getPurchaseDate());
}
то есть делать фильтр а предикат бы выбирался исходя из того какой тип объекта в стриме
stream = stream.filter((Predicate<? super T>) byDateTo(searchParams.getDateTo()));
но что-то пошло не так, а точнее фильтры имеют одинаковую сигнатуру и следовательно не могут быть скомпилированы :)
method <T>byDateTo(Date) is already defined in class SearchUtil
where T is a type-variable:
T extends Object declared in method <T>byDateTo(Date)
Хотя для одного типа объектов всё компилируется и классно работает
У вас проблема в том, что после стирания типов у вас остается 2 метода, с одинаковыми названиями: byDateTo, а в java, как известно, нельзя создавать 2 метода с одинаковыми именами. Соответственно, чтобы решить, нужно либо называть методы по разному, либо создать метод обертку, который в зависимости от типа данных в stream будет выбирать нужный вам предикат
Продвижение своими сайтами как стратегия роста и независимости