Kirill Zhukov
06/10/2019, 3:37 AMis Failure
handler and it doesn’t require to have else
branch, so the way it works right now seems inconsistent.Result
with only Success
and Failure
implementations, and I want combine two different results and basically return failure if one of the results is failure and return success otherwise.sealed class Result {
object Success : Result() {
fun s() {}
}
object Failure : Result() {
fun f() {}
}
}
val r1: Result = Result.Success
val r2: Result = Result.Failure
// pretend this combines two success results into one final success result
fun success(r1: Result.Success, r2: Result.Success) = Result.Success
val r: Result = when {
r1 is Result.Failure -> Result.Failure
r2 is Result.Failure -> Result.Failure
r1 is Result.Success && r2 is Result.Success -> success(r1, r2) // smart casting works
else -> { Result.Failure } // shouldn't happen but I have to handle it
}
val r: Result = when {
r1 is Result.Failure -> Result.Failure
r2 is Result.Failure -> Result.Failure
else -> success(r1, r2) // can't smart cast
}
Dico
06/10/2019, 3:44 AMis Result.Failure
to `!is Result.Success~Kirill Zhukov
06/10/2019, 3:46 AMelse
branch, so the compiler does seem to know that there are no more implementations of the class?
val result: Result = Result.Failure
when (result) {
is Result.Success -> result.s()
is Result.Failure -> result.f()
}
Dico
06/10/2019, 3:46 AMKirill Zhukov
06/10/2019, 3:47 AMval r: Result = when {
r1 !is Result.Success -> Result.Failure
r2 !is Result.Success -> Result.Failure
else -> success(r1, r2)
}
Dico
06/10/2019, 3:47 AMKirill Zhukov
06/10/2019, 3:47 AM