import java.lang.reflect.* abstract class AbstractRepository @Suppress("UNCHECKED_CAST") fun Class>.repositoryType(): Class = generateSequence(this) { (it as? Class<*> ?: (it as? ParameterizedType)?.rawType as? Class<*>) ?.genericSuperclass } .filterIsInstance() .first { it.rawType == AbstractRepository::class.java } .actualTypeArguments .single() as Class class IntRepository : AbstractRepository() class StringRepository : AbstractRepository() interface Foo class FooRepository : AbstractRepository() class Bar class BarRepository : AbstractRepository() fun main() { println(IntRepository::class.java.repositoryType()) println(StringRepository::class.java.repositoryType()) println(FooRepository::class.java.repositoryType()) println(BarRepository::class.java.repositoryType()) }