为什么不能在通用枚举类上调用.values()?

mef*_*f27 6 generics enums kotlin

我知道在枚举类上调用.values()会给出一系列枚举实例。但是,它不适用于通用枚举类。为什么会这样,我该怎么做才能获得相同的功能?

class EnumEditActivity<E: Enum<E>>() {    
    var value: E? = null
    var allValues: Array<E> = E.values()
}
Run Code Online (Sandbox Code Playgroud)

如果我在普通枚举上调用values(),则可以正常工作:

enum class Gender {
    male, female
}

for (value in Gender.values()) {
    println(value.name)
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

male
female
Run Code Online (Sandbox Code Playgroud)

一些答案建议做这样的事情:

enum class SomeEnum {
    one, two
}

class EnumEditActivity<E: SomeEnum>() {    
    var value: E? = null
    val values = listCases<SomeEnum>()

    inline fun <reified E: SomeEnum> listCases() = (E::class.java).enumConstants.toList()
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为它不是动态的:它始终只会获取SomeEnum的用例,因此没有通用类的意义。您不能将SomeEnum之外的任何其他枚举传递给该类,因为一个枚举不能从另一个枚举继承。

我认为在Kotlin中这是不可能的。我现在只是在定义类,因此它要求您在类初始值设定项中传递枚举实例的数组:

class EnumEditActivity<E>(val values: Array<E>)
Run Code Online (Sandbox Code Playgroud)

Dam*_*ero 3

因为您必须将函数调用到实例中,而不是类型中,所以您必须具体化类型变量:

interface  VisualEnum {
    fun get(fromName : String)
}

enum class VisuelEnumSub(lowerName: String) : VisualEnum {
    A("a"), B("b"), C("c");

    override fun get(name : String) {
        VisuelEnumSub.values().filter { it.toString().equals(name, true) }
    }}

open class AppCompatActivity{}

open class EnumEditActivity<E: VisualEnum>(): AppCompatActivity() {
    inline fun <reified A:E> onCreate() = (A::class.java).enumConstants
}

fun main(args: Array<String>) {
   EnumEditActivity<VisuelEnumSub>().onCreate<VisuelEnumSub>().forEach { println(it) }
}
Run Code Online (Sandbox Code Playgroud)

结果:

A
B
C
Run Code Online (Sandbox Code Playgroud)