我知道在枚举类上调用.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()
}
答案 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>())