Как получить список черт, которые были смешаны в указанном классе?

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

abstract trait A
trait B extends A
trait C extends A

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

5
задан Jeriho 11 May 2010 в 09:28
поделиться

3 ответа

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

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(_))

returns

Array[java.lang.Class[_]] = Array(interface A, interface B)
3
ответ дан 14 December 2019 в 19:05
поделиться
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)
1
ответ дан 14 December 2019 в 19:05
поделиться

Как насчет чего-то вроде этого:

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
ответ дан 14 December 2019 в 19:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: