class Game { fun addSystems(vararg system: System) { TODO() } } interface Component class Position : Component class Velocity : Component class Sprite : Component interface System { val track: List> } inline fun System.track(): List> { return listOf(T::class) } inline fun System.track2(): List> { return listOf(T::class, U::class) } abstract class AbstractSystem(vararg systems: KClass) : System { override val track: List> = systems.toList() } fun main() { class PhysicsSystem : AbstractSystem( Position::class, Velocity::class ) class PositionSystem : System { override val track = track() } class RenderSystem : System { override val track = track2() } Game().addSystems( PhysicsSystem(), RenderSystem() ) }