Kotlin:枚举的泛型迭代器:如何声明类型变量
解决Enum泛型迭代器中
enumValues<T>()的类型参数错误 你遇到的红色提示是Kotlin的典型限制:enumValues<T>()函数要求类型参数T是具体化的(reified),而普通泛型类的类型参数会被类型擦除,编译器在运行时无法获取T的具体类型,所以没法调用这个函数。
下面是两种可以彻底解决这个问题的方案:
方案一:通过构造函数传入枚举的KClass
我们可以把枚举类的KClass作为构造参数传给迭代器,利用KClass的enumValues()扩展函数来获取枚举值数组,这样就绕开了泛型擦除的限制:
class EnumIterator<T : Enum<T>>(private val enumClass: KClass<T>) : Iterator<T> { private var cursor = 0 // 提前初始化枚举值数组,避免重复获取 private val enumValues = enumClass.enumValues() override fun hasNext(): Boolean = cursor < enumValues.size override fun next(): T = enumValues[cursor++] } // 使用示例 enum class Color { RED, GREEN, BLUE } fun main() { val iterator = EnumIterator(Color::class) iterator.forEach { println(it) } }
另外注意修正了你原来hasNext的逻辑错误——原来的size -1会导致最后一个枚举值无法被遍历到,直接判断cursor < enumValues.size才是正确的遍历逻辑。
方案二:用内联函数返回匿名迭代器(更简洁)
如果不想单独定义一个迭代器类,我们可以利用内联函数的reified特性,直接在函数里创建并返回一个匿名迭代器:
inline fun <reified T : Enum<T>> enumIterator(): Iterator<T> { val values = enumValues<T>() var cursor = 0 return object : Iterator<T> { override fun hasNext(): Boolean = cursor < values.size override fun next(): T = values[cursor++] } } // 使用示例 fun main() { val colorIterator = enumIterator<Color>() colorIterator.forEach { println(it) } }
内联函数的reified类型参数会让编译器在编译时把T替换成具体的枚举类型,这样enumValues<T>()就能正常工作了,这种写法也更符合Kotlin的简洁风格。
内容的提问来源于stack exchange,提问作者Min-Soo Pipefeet
相关产品推荐
相关产品推荐

