Учитывая экземпляр любого типа класса, как узнать, какой родительский класс и/или его свойства он наследует или реализует?

Предположим, что существуют определения класса/признака следующим образом:

trait T1 {}
trait T2 {}
abstract class A{}

class B {}
class C extends A with T1 with T2 {}

val b = new B with T1
val c = new C

Учитывая экземпляр b и c, как мне получить информацию о наследовании (т.е. знать, что b реализует T1, а c реализует A, T1 и T2)?

Спасибо за вашу помощь.

Ответ 1

Если вы не знаете тип объекта (у вас есть AnyRef) и просто хотите проверить, является ли он экземпляром какого-либо класса или признака, вы можете использовать isInstanceOf:

b.isInstanceOf[T2]

Если вы хотите применить его к этому типу, используйте asInstanceOf

b.asInstanceOf[T1]

С другой стороны, если вы не знаете, что ищете, тогда вы можете попытаться использовать отражение Java. Чтобы получить список реализованных черт и интерфейсов, используйте:

c.getClass.getInterfaces

Чтобы использовать суперкласс:

c.getClass.getSuperclass