我需要创建从Int到List的泛型扩展函数,其中E是带有一个Int形参的Enum
例子,我是怎么想象的:
fun <E: Enum<Int>> Int.toEnumList(): List<E> =
E.values()
.filter { /* some logic */ }
.toList
和我想要相同的结果语法:
enum class Animal(val maxAge: Int) {
CAT(15), BIRD(8), HAMSTER(4)
}
val filteredAnimals = 8.toEnumList()
// >> [BIRD, HAMSTER]
我怎么能做那样的事呢?
首先,没有"带整型参数的enum"这样的东西。Enum和其他类一样:它可以有一个属性、多个属性或根本没有属性。它们都不被认为是它的主要参数或第一个参数。
因此,我们确实需要定义一个接口来获取您感兴趣的int值,例如:interface MyInterface {
val myInt: Int
}
enum class Animal(val maxAge: Int) : MyInterface {
CAT(15), BIRD(8), HAMSTER(4);
override val myInt get() = maxAge
}
则可以在toEnumList()
函数中使用。我不知道您的过滤逻辑,所以我只搜索具有特定int值的项:
inline fun <reified E> Int.toEnumList(): List<E> where E : Enum<E>, E: MyInterface =
enumValues<E>()
.filter { it.myInt == this@toEnumList }
fun main() {
println(8.toEnumList<Animal>()) // [BIRD]
}
另外,这只是我的个人意见,但我不确定Int
上的这种扩展是一个好主意。当你对整数做一些事情时,它会干扰代码补全功能。而且它看起来不像是一个与整数相关的特性,而是与枚举相关的特性。