Как насчет этого:
def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = {
clazz.getInterfaces().filter { baseTrait isAssignableFrom _ }
}
Находит все черты, которые реализует clazz
, которые сами являются субтитрами baseTrait
. Со следующими чертами:
trait A
trait B extends A
trait C extends A
trait D
Использовать следующим образом:
scala> val x1 = new C with B
x1: java.lang.Object with C with B = $anon$1@51d92803
scala> getTraitsExtending(x1.getClass, classOf[A])
res0: Seq[Class[_]] = WrappedArray(interface C, interface B)
scala> val x2 = new C with A
x2: java.lang.Object with C with A = $anon$1@f8db08
scala> getTraitsExtending(x2.getClass, classOf[A])
res1: Seq[Class[_]] = WrappedArray(interface C, interface A)
scala> val x3 = new C with D
x3: java.lang.Object with C with D = $anon$1@2bbd83d
scala> getTraitsExtending(x3.getClass, classOf[A])
res3: Seq[Class[_]] = WrappedArray(interface C)
Здесь рассматриваются только те интерфейсы, которые непосредственно реализованы классом переданного экземпляра, но могут быть расширены для рекурсивного поиска иерархии наследования.