interface Identifiable {
val id: Int
}
enum class MyEnum(override val id: Int) : Identifiable {
A(1), B(2)
}
inline fun <reified T> findById(id: Int): T? where T : Enum<T>, T : Identifiable {
return enumValues<T>().find { it.id == id }
}
fun main() {
println(findById<MyEnum>(id = 1)) // A
println(findById<MyEnum>(id = 2)) // B
println(findById<MyEnum>(id = 3)) // null
}
or you can also do this to make the function more hermetic:
fun <T> findById(clazz: Class<T>, id: Int): T? where T : Enum<T>, T : Identifiable {
return clazz.enumConstants.find { it.id == id }
}
inline fun <reified T> findById(id: Int): T? where T : Enum<T>, T : Identifiable {
return findById(T::class.java, id)
}
Thanks, that looks already pretty good. Do you see any chance to make an extension function from it? At least in my trials it didn’t work (in the sense of passing the compiler …).