Kotlin:如何用扩展函数扩展enum类
我想用下面的函数扩展types为String
枚举类,但无法在调用站点使用它,如下所示:
fun <T: Enum> Class.join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.enumConstants .drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() } MyStringEnum.join(1, 1);
我在这里做错了什么?
我建议以下解决方案:
fun > KClass .join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.java .enumConstants .drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() }
而不是附加扩展function类,我把它附加到KotlinClass。
现在,你可以简单地使用它:
enum class Test {ONE, TWO, THREE } fun main(args: Array) { println(Test::class.join()) } // ONE, TWO, THREE
我会用通配符稍微改写你的连接:
fun > Class.join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.enumConstants .drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() }
然后,假设你的MyStringEnum是这样定义的:
enum class MyStringEnum { FOO, BAR, BAZ }
你可以这样调用它:
println(MyStringEnum.values()[0].javaClass.join())
获得输出“FOO,BAR,BAZ”
既然你正在定义类的连接,你需要一个实际的类对象来调用它。 枚举类显然不像那样工作,但是其定义的枚举可以用javaClass
产生一个类。 所以这是我能想到的最好的,我认为符合你的要求的一般精神。 我不知道是否有一个更优雅的方式来实现你要为所有的枚举类这样做。
编辑:你可以收紧一点这个更多一点:
fun Enum<*>.join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.javaClass.join(skipFirst, skipLast) }
这可以让你这样打电话:
println(MyStringEnum.values()[0].join())
@IRus’的答案是正确的,但你不必使用reflection。 对于每个枚举类,编译器会自动生成一个values()
方法。 此方法返回一个包含所有条目的数组。 我们可以使扩展函数直接在这个数组上运行:
fun > Array .join(skipFirst: Int = 0, skipLast: Int = 0) = drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString()
并像这样调用它:
fun main(args: Array) { Test.values().join() }