可以解决为了满足编译器的要求而编写无用条件分支的情况
没有写密封类的时候
interface Result
class Success(val msg: String):Result
class Failure(val error:Exception):Result
fun getResultMsg(result: Result) = when(result){
is Success -> result.msg
is Failure -> result.error.message
else -> throw IllegalArgumentException() //这个分支只是为了满足编译器不报错的条件
}
使用密封类代替原来的接口
sealed class Result
class Success(val msg: String):Result()
class Failure(val error:Exception):Result()
class Unknown(val msg: String):Result()
fun getResultMsg(result: Result) = when(result){//此处不用再写else分支
is Success -> result.msg
is Failure -> result.error.message
is Unknown -> result.msg
}
当when中传入一个密封类变量的时候,编译器会自动检查这个密封类的所有子类,并强制要求对每一个条件全部处理
内容来源 《第一行代码》郭霖