Мне нужно на занятия
public class Consumer{
private String name;
private int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
и далее
public class Donor {
private String name;
private int amount;
private String location;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
теперь у меня есть другой класс, который содержит метод method1 ()
public class GenericClass<T> {
public void method1(List<T> list){
Iterator i = list.iterator();
while (i.hasNext()){
}
}
}
и мой основной метод
public class MainMethod {
public static void main(String[] args) {
List<Donor> d = new ArrayList<>();
Donor donor = new Donor();
donor.setAmount(500);
donor.setName("bill");
Donor donor1 = new Donor();
donor.setAmount(1250);
donor.setName("linda");
d.add(donor);
d.add(donor1);
GenericClass genericClass = new GenericClass();
genericClass.method1(d);
}
}
Я хочу сделать этот метод1 () динамическим и вернуть динамический результат.
Итак, если я отправлю список Потребителей, он должен вернуть мне сумму всех зарплат, а если я пришлю список Доноров, он должен отправить мне сумму пожертвованной суммы?
как этого добиться?




Во-первых, вы, вероятно, сделаете не класс GenericClass универсальным, а метод method1().
Затем вы можете предоставить ToIntFunction<T>, который принимает объект типа T и возвращает значение int. Таким образом, ваш метод может выглядеть так (код Java8):
public <T> int method1(List<T> list, ToIntFunction<T> transformation){
return list.stream().collect(Collectors.summingInt(transformation));
}
Затем вы вызываете этот метод следующим образом:
int sumSalaries = method1(consumers, Consumer::getSalary);
int sumDonations = method1(donors, Donor::getAmount);
Также возможен код до Java8, но он будет немного больше (вам потребуется предоставить ToIntFunction, реализации этого интерфейса и тело метода немного большего размера).
В качестве альтернативы вы можете использовать интерфейс, реализованный обоими классами, но для этого потребуется использовать общее имя метода (например, getAmount() или getIntValue() и т. д.)
Возможный дубликат Как вызвать метод объекта универсального типа?