创建以下枚举:
enum class Rule(val returnType: KClass<*>) {
A(Boolean::class),
B(Integer::class)
}
当我像val y = Rule.A.returnType
一样使用它时,resultValue的类型当然是KClass<*>
。但我不想要那个,我想要真实的类型,所以A是KClass<Boolean>
.
有没有一种方法可以做到这一点,而不铸造它自己?
我为什么想要这个?我试图建立一个易于使用的规则引擎。目前我有以下代码:
interface Evaluator {
operator fun <T> invoke(rule: Rule): T
}
我可以这样使用它:
fun createEvaluatorX(process: Evaluator) =
when (process<Boolean>(Rule.A)) {
true -> when (process<Integer>(Rule.B)) {
when 1 -> // another rule (etc)
when 2 -> ..
else ->
}
false -> ..
}
如果规则本身定义返回类型而不是内联,那就太好了。特别是当您多次使用同一规则时(在不同的求值器中)。由于枚举类不能有类型参数,我试图通过在枚举中定义一个KClass来解决这个问题。
1条答案
按热度按时间dy2hfwbg1#
Enum types 可以有类型参数,但enum instances 不能。但是Kotlin有
sealed
类,它提供了许多与枚举相同的好处: