Wie Liste von Eigenschaften erhalten, die in der angegebenen Klasse gemischt wurde?

StackOverflow https://stackoverflow.com/questions/2809463

  •  25-09-2019
  •  | 
  •  

Frage

Und konkreteres Beispiel:

abstract trait A
trait B extends A
trait C extends A

Wie zu prüfen, welche Eigenschaften, die Eigenschaft A verlängern (von 0 auf viele sein können) in bestimmten Klasse gemischt?

War es hilfreich?

Lösung

Wie wäre es ein Hybrid aus den anderen Antworten

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

Rückkehr

Array[java.lang.Class[_]] = Array(interface A, interface B)

Andere Tipps

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)

Wie wäre es etwa so:

def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = {
  clazz.getInterfaces().filter { baseTrait isAssignableFrom _ }
}

Dieses findet alle Eigenschaften, die clazz Geräte, die selbst subtraits von baseTrait. Mit den folgenden Merkmalen:

trait A
trait B extends A
trait C extends A
trait D

Verwenden Sie wie folgt vor:

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)

Dies ist nur Blicke an den Schnittstellen, die die direkt umgesetzt durch die Klasse der Instanz übergeben, sind aber verlängert werden könnte, um rekursiv die Vererbungshierarchie nachschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top