Kotlin:如何用扩展函数扩展enum类

我想用下面的函数扩展类型为String枚举类,但无法在调用站点使用它,如下所示:

 fun <T: Enum<String>> Class<T>.join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.enumConstants .drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() } MyStringEnum.join(1, 1); 

我在这里做错了什么?

3 Solutions collect form web for “Kotlin:如何用扩展函数扩展enum类”

我建议以下解决方案:

 fun <T : Enum<*>> KClass<T>.join(skipFirst: Int = 0, skipLast: Int = 0): String { return this.java .enumConstants .drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() } 

而不是附加扩展功能类,我把它附加到KotlinClass。

现在,你可以简单地使用它:

 enum class Test {ONE, TWO, THREE } fun main(args: Array<String>) { println(Test::class.join()) } // ONE, TWO, THREE 

我会用通配符稍微改写你的连接:

 fun <T: Enum<*>> Class<T>.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'的答案是正确的,但你不必使用反射。 对于每个枚举类,编译器会自动生成一个values()方法。 此方法返回一个包含所有条目的数组。 我们可以使扩展函数直接在这个数组上运行:

 fun <T : Enum<*>> Array<T>.join(skipFirst: Int = 0, skipLast: Int = 0) = drop(skipFirst) .dropLast(skipLast) .map { e -> e.name } .joinToString() 

并像这样调用它:

 fun main(args: Array<String>) { Test.values().join() } 
  • 如何检查kotlin中的“instanceof”类?
  • 为什么我们有在Kotlin中命名为componentN的函数?
  • 这个引用在kotlin扩展属性的lazy初始值设定中
  • 无法使用Kotlin访问EditText或其他UI组件
  • 在Kotlin编程语言中循环
  • 如何扩展Kotlin Number类或使用泛型来创建一个简单的属性getter,它将在所有的Nu​​mber子类上运行?
  • 在V1.0.1中不能识别Kotlin扩展属性
  • Android库不能编译kotlin
  • 如何在同一个src文件夹中运行不同的.kt文件/类?
  • 如何在父上下文中创建变量
  • Kotlin - 延期上课
  • Kotlin language will be the best programming language for Android.