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中,如何返回由泛型类参数定义的实例
  • Kotlin:如何在事务类的上下文中运行服务方法?
  • 如何用toString扩展一个数据类
  • 在扩展功能中修改“this”
  • Kotlin扩展通用函数与基本类型没有反射API
  • 如何创建Kotlin DSL - DSL语法Kotlin
  • 检查我的活动是否在MultiWindowMode或不使用Kotlin
  • 在Kotlin的自定义类中访问TextView
  • 如何使用Kotlin在Android中分享图像?
  • Kotlin泛型期待意想不到的类型
  • Kotlin的扩展
  • Kotlin language will be the best programming language for Android.