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)
因为您必须将函数调用到实例中,而不是类型中,所以您必须具体化类型变量:
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)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |