我试图获得 ClassSymbol 的直接超类/特征。该方法baseClasses()
对我不起作用,因为它还包括 super super.. 类型。
和实际上对于我的用例来说已经足够了java.lang.Class.getSuperclass()
,但是在宏观环境中java.lang.Class.getInterfaces()
我找不到从ClassSymbol
到的方法!java.lang.Class
我试图获得 ClassSymbol 的直接超类/特征。该方法baseClasses()
对我不起作用,因为它还包括 super super.. 类型。
和实际上对于我的用例来说已经足够了java.lang.Class.getSuperclass()
,但是在宏观环境中java.lang.Class.getInterfaces()
我找不到从ClassSymbol
到的方法!java.lang.Class
如果您使用宏 - 您无法获取Class
编译时不存在(加载)的类的运行时对象(因此您无法从那里访问编译类)。但是,您可以编写自己的函数:
def getDirectBase(a: ClassSymbol) = {
val base = a.baseClasses.toSet - a //`baseClasses` contains `a` itself
val basebase = base.flatMap {
case x: ClassSymbol => x.baseClasses.toSet - x
}
base -- basebase
}
结果(使用运行时反射获得的示例,但此处的编译时应该相同):
scala> class A
scala> class B extends A
scala> class C extends B
scala> typeOf[C].typeSymbol.asInstanceOf[ClassSymbol].baseClasses
res37: List[reflect.runtime.universe.Symbol] = List(class C, class B, class A, class Object, class Any)
scala> getDirectBase(typeOf[C].typeSymbol.asInstanceOf[ClassSymbol])
res38: scala.collection.immutable.Set[reflect.runtime.universe.Symbol] = Set(class B)