gpt4 book ai didi

kotlin - 为什么 Kotlin 密封类无法实现子类型函数重载?

转载 作者:行者123 更新时间:2023-12-02 12:42:44 25 4
gpt4 key购买 nike

假设我有一个用于服务器响应的密封类:

sealed class Response{
class Success: Response()
class ErrorA: Response()
class ErrorB: Response()
}

还有一个虚假的回复:

fun getResponse(): Response{
val r = Random()
return when (r.nextInt(3)) {
0 -> { Response.Success() }
1 -> { Response.ErrorA() }
2 -> { Response.ErrorB() }
else -> { throw IllegalStateException() }
}
}

我想处理响应。我目前可以使用这样的东西:

fun handle(response: Response) = when (response) {
is Response.Success -> { handle(response) }
is Response.ErrorA -> { handle(response) }
is Response.ErrorB -> { handle(response) }
}

然后编译器将确保处理所有情况。一个很棒的功能!

但是,为什么我不能做这样的事情:

class ResponseHandler(){

fun handle(success: Response.Success) {}

fun handle(error: Response.ErrorB) {}

fun handle(error: Response.ErrorA) {}
}

并调用

ResponseHandler().handle(response)

这实现了同样的事情但没有编译,我的问题是:就像编译器在运行时确保所有情况都在 when 语句中处理一样,为什么相同的逻辑不适用于方法重载?

任何进一步阅读的信息或推荐都会非常有帮助。谢谢

最佳答案

原则上它可以完成(主要是通过自动生成 handle(response: Response) = when ... 方法)。但我认为这永远不可能。 Kotlin 中的重载与 Java/Scala/其他 JVM 语言中的工作原理基本相同,为了如此小的好处而引入主要差异看起来不是一个好主意(当然这不适用于 when这是 Kotlin 特有的)。

如果需要,您可以在 ResponseHandler 中定义相同的 fun handle(response: Response)(并使另一个 handle方法 open 所以它实际上很有用)。

关于kotlin - 为什么 Kotlin 密封类无法实现子类型函数重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com