Допустим, у меня есть запечатанный класс, который я использую для ответа сервера:
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
, почему такая же логика не может быть применена к перегрузке метода?
Любойинформация или ссылки для дальнейшего чтения были бы чрезвычайно полезными.Спасибо