Как можно найти всех предков и наследников класса в 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.