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

时间:2019-08-30 18:41:26

标签: generics kotlin enums

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

        research   

     default query  
     default query  
     query group   
      query group 

如果我在普通枚举上调用values(),那么它将正常工作:

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

打印:

enum class Gender {
    male, female
}

for (value in Gender.values()) {
    println(value.name)
}

一些答案​​建议这样做:

male
female

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

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

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()
}

4 个答案:

答案 0 :(得分: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) }
}

结果:

A
B
C

答案 1 :(得分:1)

Enum是所有枚举类的通用基类。您可以将Enum<*>用作通用类型T的上限。由于必须访问它,因此必须重新定义类型(因此必须重新定义函数inline)。

inline fun <reified T: Enum<T>> enumValues(): Array<T> {
    // do something...
    return T::class.java.enumConstants
}

给出一个枚举:

enum class SomeEnum { One, Two }

该函数可以这样调用:

println(enumValues<SomeEnum>().toList())

并返回:

  

[一个,两个]

答案 2 :(得分:0)

如果没有编译时的安全,可以使用Java的value.declaringClass.enumConstants

答案 3 :(得分:0)

您只能通过将类作为参数来进行此操作(因为E是类类型参数,而reified不可用):

class EnumEditActivity<E: Enum<E>>(cls: Class<E>) {    
    var value: E? = null
    var allValues: Array<E> = cls.enumConstants
}

inline fun <reified E: Enum<E>> EnumEditActivity() = EnumEditActivity(E::class.java)

// call as
EnumEditActivity<YourEnum>()

或者与您的

class EnumEditActivity<E>(val values: Array<E>)

您可以使用标准的enumValues函数:

inline fun <reified E: Enum<E>> EnumEditActivity() = EnumEditActivity(enumValues<E>())