有没有可能在Kotlin中创建递归函数types?

我有代表一个过程中的步骤的函数。 每个function也知道下一步,如果有的话。 我希望能够做到这样的事情:

fun fooStep() : Step? { ... do something ... return ::barStep // the next step is barStep } 

这些函数是从一个中央调度函数调用的,它的代码有点像这样:

 var step = startStep while (step != null) { step = step() } 

请注意,特定步骤中的逻辑也决定下一步,如果有的话。

我以为我可以定义为:

 typealias Step = () -> Step? 

所以一个Step是一个返回另一个Step的函数,或者是null。 但是,这不能编译:

 Kotlin: Recursive type alias in expansion: Step 

我可以通过将函数包装在一个对象中来解决这个问题。 例如:

 data class StepWrapper(val step: () -> StepWrapper?) 

并相应地更改我的function签名。

不幸的是,这意味着我不能只使用函数文字(例如::barStep ),而是必须将它们包装在StepWrapper

 fun fooStep() : StepWrapper? { ... do something ... return StepWrapper(::barStep) } 

(我也必须相应地改变我的调度循环。)

如果可能的话,我想避免需要创建这些包装对象。 Kotlin有没有办法做到这一点?

您可以使用一些通用接口来定义它:

 interface StepW : ()->T? interface Step : StepW class Step1 : Step { override fun invoke(): Step? = Step2() } class Step2 : Step { override fun invoke(): Step? = null } 

Step是你的递归函数types。

以下是你如何使它工作,虽然我真的不知道你想用它来实现什么:

 typealias Fun = () -> T typealias Step = () -> (T) typealias Step1 = Step> typealias Step2 = Step> typealias Step3 = Step fun step1(): Step1 { return { println("step 1") ::step2 } } fun step2(): Step2 { return { println("step 2") ::step3 } } fun step3(): Step3 { return { println("done") } } 

使用Enum来实现具有有限状态的状态模式,并希望返回非空值。 一个枚举可以从一个函数inheritance。

 enum class Step : () -> Step { Step1 { override fun invoke() = Step2 }, Step2 { override fun invoke() = End }, End { override fun invoke() = this } } fun work() { var step = Step.Step1 while (step !== Step.End) { step = step() } }