传递一个密封的 class 作为函数参数 android
Pass a sealed class as function argument android
我有一个密封的 class 代表我的 API 的 Retrofit Response。
sealed class NetworkResponse<out T : Any, out U : Any> {
data class Success<T : Any>(val body: T) : NetworkResponse<T, Nothing>()
data class ApiError<U : Any>(val body: U, val code: Int) : NetworkResponse<Nothing, U>()
data class NetworkError(val error: IOException) : NetworkResponse<Nothing, Nothing>()
data class UnknownError(val error: Throwable?) : NetworkResponse<Nothing, Nothing>()
}
所以现在我想创建一个函数来处理失败请求的所有错误。我只想有一个参数代表 ApiError 或 NetworkError 或 UnknownError
fun networkErrorHanlder(mError: <what_should_i_put_here??>) {
// check if error is Api or Network or Unknown and do stuff...
}
参数的类型应该是什么?
由于您只关心 ApiError
、NetworkError
和 UnknownError
,它们都派生自 NetworkResponse
但不使用第一个泛型类型,您可以指定你不关心它使用 *
(实际上,取决于你想用 mError
做什么,你也可以用 *
替换 U
- 这就是case 在下面的代码中,但我引入了 U
以防万一)。在这种情况下,您应该接受 NetworkReponse
:
fun <U : Any> networkErrorHanlder(mError: NetworkResponse<*, U>) {
when(mError) {
is NetworkResponse.ApiError ->
print("Api stuff: ${mError.body}")
is NetworkResponse.NetworkError ->
print ("Network stuff: ${mError.error}")
is NetworkResponse.UnknownError ->
print("Unknown: ${mError.error}")
else -> print("It must've been a Success...")
}
}
我有一个密封的 class 代表我的 API 的 Retrofit Response。
sealed class NetworkResponse<out T : Any, out U : Any> {
data class Success<T : Any>(val body: T) : NetworkResponse<T, Nothing>()
data class ApiError<U : Any>(val body: U, val code: Int) : NetworkResponse<Nothing, U>()
data class NetworkError(val error: IOException) : NetworkResponse<Nothing, Nothing>()
data class UnknownError(val error: Throwable?) : NetworkResponse<Nothing, Nothing>()
}
所以现在我想创建一个函数来处理失败请求的所有错误。我只想有一个参数代表 ApiError 或 NetworkError 或 UnknownError
fun networkErrorHanlder(mError: <what_should_i_put_here??>) {
// check if error is Api or Network or Unknown and do stuff...
}
参数的类型应该是什么?
由于您只关心 ApiError
、NetworkError
和 UnknownError
,它们都派生自 NetworkResponse
但不使用第一个泛型类型,您可以指定你不关心它使用 *
(实际上,取决于你想用 mError
做什么,你也可以用 *
替换 U
- 这就是case 在下面的代码中,但我引入了 U
以防万一)。在这种情况下,您应该接受 NetworkReponse
:
fun <U : Any> networkErrorHanlder(mError: NetworkResponse<*, U>) {
when(mError) {
is NetworkResponse.ApiError ->
print("Api stuff: ${mError.body}")
is NetworkResponse.NetworkError ->
print ("Network stuff: ${mError.error}")
is NetworkResponse.UnknownError ->
print("Unknown: ${mError.error}")
else -> print("It must've been a Success...")
}
}