У меня есть два метода, как следующийметод принять один объект класса или другой объект класса
private List<Long> getIds(String name, List<Cat> cats) {
List<Long> catIds = new ArrayList<>();
for (Cat cat : cats) {
if (cat.getName().equals(name)) catIds.add(cat.getId());
}
return catIds;
}
private List<Long> getIds(String name, List<Dog> dogs) {
List<Long> dogIds = new ArrayList<>();
for (Dog dog : dogs) {
if (dog.getName().equals(name)) dogIds.add(dog.getId());
}
return dogIds;
}
Мой кот и собака класса являются
public class Cat {
String name;
Long id;
// additional variables
// getters and setters
}
public class Dog {
String name;
Long id;
// additional variables
// getters and setters
}
Просто, чтобы избежать дублирования, я хотел преобразуйте вышеуказанные два метода в один общий метод.
Я попробовал следующее
private List<Long> getIds(String name, List<T> objects) {
List<Long> ids = new ArrayList<>();
for (T object : objects) {
if (object.getName().equals(name)) ids.add(object.getId());
}
return ids;
}
Но это не работает, как он жалуется, что общий T не имеет getName
или getId
Здесь Cat
и Dog
имеют встроенные классы Java. В результате I НЕ МОГУТ выполнить наследование и предоставить суперкласс Animal
для них с name
и id
в качестве переменных данных.
Есть ли способ, которым я мог бы слить два вышеуказанных метода без реализации наследования?
make Animal interface содержащий getName. реализуйте это в Cat and Dog. в вашем методе getIds, измените? extends Animal –
Вы также можете просмотреть этот [рецепт для утиной печати на Java] (https://en.wikipedia.org/wiki/Duck_typing#In_Java) из Википедии ... –