そしてより具体的な例:
abstract trait A
trait B extends A
trait C extends A
指定されたクラスで、特性 A を拡張する特性 (0 から多数まで可能) が混合されていることを確認するにはどうすればよいですか?
他の答えのハイブリッドはどうですか
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)
このようなものはどうですか:
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)
これは、渡されたインスタンスのクラスによって直接実装されているインターフェイスのみを調べますが、継承階層を再帰的に検索するように拡張できます。
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)