Scala 如何获取在指定类中混合的特征列表?

Scala 如何获取在指定类中混合的特征列表?,scala,traits,Scala,Traits,还有更具体的例子: abstract trait A trait B extends A trait C extends A 如何检查在指定的类中混合了哪些扩展特性A(可以是0到多个)的特性 像这样的东西怎么样: 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: Ar

还有更具体的例子:

abstract trait A
trait B extends A
trait C extends A

如何检查在指定的类中混合了哪些扩展特性A(可以是0到多个)的特性

像这样的东西怎么样:

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

这只查看由传入实例的类直接实现的接口,但可以扩展为递归查找继承层次结构

把其他答案混合起来怎么样

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)

我曾经考虑过这个显而易见的方法,但决定在这里提问,因为我知道traits可以以复杂的方式编译。当语言特性足够时,永远不要使用反射。我同意。我首先使用了isInstanceOf,它回答了他的问题。但当我重新阅读他的实际问题标题“如何获得特征列表…”时,我切换到了getInterfaces。啊。阅读理解方面。。。在不久的将来,将有一个Scala特定的反射接口,但我相信它目前还处于萌芽状态。(对不起,我再也不能撤销我对基于反思的答案的否决票了。)这看起来非常像我的答案+一点样板:)@Kevin-日期戳上说你的答案看起来非常像我的答案…:-p这不是我按“最新”订购时看到的结果: