Как получить список черт, которые были смешаны в указанном классе? - PullRequest
5 голосов
/ 11 мая 2010

И более конкретный пример:

abstract trait A
trait B extends A
trait C extends A

Как проверить, какие черты, которые расширяют черту A (может быть от 0 до многих), были смешаны в указанном классе?

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Как насчет гибрида других ответов

abstract trait A //interested in this one
trait B extends A //and this one
trait C extends A //this one too
trait D //don't care about this one though

val x = new A with B with D
x.getClass.getInterfaces.filter(classOf[A].isAssignableFrom(_))

возвращает

Array[java.lang.Class[_]] = Array(interface A, interface B)
1 голос
/ 11 мая 2010

Как насчет этого:

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)

Здесь рассматриваются только те интерфейсы, которые непосредственно реализованы классом переданного экземпляра, но могут быть расширены для рекурсивного поиска иерархии наследования.

1 голос
/ 11 мая 2010
scala> val x = new A with B with C
x: java.lang.Object with A with B with C = $anon$1@8ea25fa

scala> x.getClass.getInterfaces
res11: Array[java.lang.Class[_]] = Array(interface A, interface B, interface C)
...