Рекурсивный вызов суперкласса. Рефлексия
Нужно написать рекурсивный метод, показывающий всех родителей переданного в параметр объекта, кроме Object. Например, для объекта кошка: Кошачие, Млекопитающие, Животные...
Пробовал так, но получил бесконечную рекурсию:
public class ShowParent {
ArrayList list = new ArrayList();
public void getAllParentsExceptObject(Class investigatedClass) {
Class currentClass = investigatedClass.getClass();
list.add(currentClass.getSuperclass());
getAllParentsExceptObject((Class) list.get(list.size()-1));
}
public static void main(String[] args) {
TheCat cat = new TheCat();
ShowParent sp = new ShowParent();
sp.getAllParentsExceptObject(cat.getClass());
System.out.println(sp.list.toString());
}
}
И так:
public void getAllParentsExceptObject() {
if (!this.getClass().equals(Object.class)) {
this.getClass().getSuperclass();
getAllParentsExceptObject();
}}
Та же бесконечная рекурсия
Ответы (2 шт):
Автор решения: Alexandr
→ Ссылка
Вариант с использованием Stream API:
public static Stream<Class<?>> getSuperclasses(Class<?> clazz) {
if (Object.class.equals(clazz)) {
return Stream.empty();
} else {
return Stream.concat(
Stream.of(clazz),
getSuperclasses(clazz.getSuperclass()));
}
}
public static void main(String[] args) {
System.out.println(
getSuperclasses(TheCat.class)
.map(Class::getSimpleName)
.collect(Collectors.joining(", ")));
}
Автор решения: Barmaley
→ Ссылка
А нельзя совсем просто?
public List<Class> getAllParentsExceptObject(List<Class> parents, Class investigatedClass) {
Class currentClass = investigatedClass;
if(currentClass.equals(Object.class))
return parents;
parents.add(currentClass);
Class superClass=currentClass.getSuperclass());
return getAllParentsExceptObject(parents, superClass);
}
public static void main(String[] args) {
TheCat cat = new TheCat();
ShowParent sp = new ShowParent();
List<Class> parents=sp.getAllParentsExceptObject(new ArrayList<Class>(), cat.getClass());
System.out.println(parents);
}