Как можно найти всех предков и наследников класса в Scala/Java?

(Можно объяснить и на Java, потом разберусь)

Допустим, имеется такая иерархия в Scala:

trait A
class B extends A
class C extends A    
class D extends C

Как можно найти всех предков (parents) и наследников (child)? Например:

A.childs => List(B, C, D)
A.parents => List()
D.parents => List(A, C)

Ответы (1 шт):

Автор решения: BccHnw

parents прямолинейно реализуется при помощи reflection.

trait A
class B extends A
class C extends A
class D extends C

object Parents extends App {
  def parents(result: mutable.HashSet[Class[_]], clazz: Class[_]): Unit = {
    val superClass = clazz.getSuperclass
    if (superClass != null && superClass != classOf[java.lang.Object]) {
      result += superClass
      parents(result, superClass)
    }
    for (interfaceClass <- clazz.getInterfaces) {
      result += interfaceClass
      parents(result, interfaceClass)
    }
  }
  def parents(clazz: Class[_]): List[Class[_]] = {
    val result = new mutable.HashSet[Class[_]]()
    parents(result, clazz)
    result.toList
  }

  println(parents(classOf[A]).map{_.getName})
  println(parents(classOf[D]).map{_.getName})
}

В этой реализации Object не считается родителем.

С children сложнее, но в замкнутой среде (когда это нужно только для группы классов) можно построить как обратную функцию от parents.

→ Ссылка