在Kotlin中使用存储在枚举中的返回类型

thigvfpy  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(170)

创建以下枚举:

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来解决这个问题。

dy2hfwbg

dy2hfwbg1#

Enum types 可以有类型参数,但enum instances 不能。但是Kotlin有sealed类,它提供了许多与枚举相同的好处:

sealed interface Rule<T> 
class RuleA: Rule<Boolean>
class RuleB: Rule<Int>

fun evaluate(rule: Rule<T>) = when (rule) {
  is RuleA -> // call RuleA-method returning Boolean
  is RuleB -> // call RuleB-method returning Int
  // no need for an else block as long as you hit all `Rule` subtypes
}

相关问题