如何在Kotlin中创建泛型扩展函数,哪个参数是特定的enum?



我需要创建从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上的这种扩展是一个好主意。当你对整数做一些事情时,它会干扰代码补全功能。而且它看起来不像是一个与整数相关的特性,而是与枚举相关的特性。

最新更新