У меня проблемы с использованием и пониманием дженериков. Раньше я работал с дженериками, но теперь я попал в точку, где я не могу продолжать дальше
Вот мой базовый класс c, который должен быть расширен другими классами:
public class BaseFiller<T> {
private WorkBook workBook;
private List<T> act_Bwa;
private List<T> act_Balance;
private List<T> p_l_v_e_L;
public BaseFiller(WorkBook workBook,
List<T> act_Bwa,
List<T> act_Balance,
List<T> p_l_v_e_L) {
this.workBook = workBook;
this.act_Bwa = act_Bwa;
this.act_Balance = act_Balance;
this.p_l_v_e_L = p_l_v_e_L;
}
protected static <T> Predicate<T> distinctByProperty(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
protected static <T> Map<Integer, String> mapListToMap(Collection<? extends T> entityList, Function<? super T, Integer> intProperty,
Function<? super T, String> stringProperty) {
return entityList.stream()
.collect(Collectors.toMap(intProperty, stringProperty));
}
//Getter & Setter
}
Следующий класс расширяет базовый класс:
public class FinanceBalanceFiller<T> extends BaseFiller<T> {
.
.
.
public FinanceBalanceFiller(WorkBook workBook, List<T> act_Bwa,
List<T> act_Balance,
List<T> p_l_v_e_L) {
super(workBook, act_Bwa, act_Balance, p_l_v_e_L);
}
public Map<Integer, String> makeMapFromAllLists() {
List<ResultlinevaluesEntity> res = new ArrayList<>();
for (List<ResultlinevaluesEntity> list : getAct_Bwa()) {
res.addAll(list);
}
//removes all duplicates from List by DbNr
List<ResultlinevaluesEntity> resWithoutDuplicates = res.stream()
.filter(distinctByProperty(ResultlinevaluesEntity::getDb_nr))
.collect(Collectors.toList());
//creates HashMap (Key = DbNr, Value = name)
return mapListToHashMap(resWithoutDuplicates, ResultlinevaluesEntity::getDb_nr,
ResultlinevaluesEntity::getName);
}
В методе makeMapFromAllLists () у меня проблемы в моем For l oop. Это выдает ошибку, что типы не совместимы друг с другом.
Ошибка: (116, 68) java: несовместимые типы: T нельзя преобразовать в java .util.List
Я понимаю, и я изменил это так:
List<T> res = new ArrayList<>();
for (List<T> list : getAct_Bwa()) {
res.addAll(list);
}
Но это тоже не работает, потому что типы здесь тоже не подходят. Кроме того, у меня возникают проблемы с Methdode differentByProperty из базового класса. Здесь компилятор говорит:
Нестатистический метод c не может быть вызван из статического c контекста
Между тем я полностью сбит с толку и могу дальше не будем.
Итак, моя цель состоит в том, чтобы все методы в методе makeMapFromAllLists () обслуживали не только ListType "ResultLineValuesEntity", но и другие типы.
Может ли кто-нибудь помочь мне и показать мне, как обращаться с дженериками на этом этапе?