Я создал такой класс:
sealed class Either<out L, out R> {
//Failure
data class Left<out L>(val value: L) : Either<L, Nothing>()
//Success
data class Right<out R>(val value: R) : Either<Nothing, R>()
val isRight get() = this is Right<R>
val isLeft get() = this is Left<L>
}
Я использую модификацию и планирую вернуть:
@GET(__SOMEPATH__)
suspend fun pews(__Whatever__) : Either<Throwable, POJO>
Но когда Gson
пытается создатьобъект, исключение выдается:
java.lang.RuntimeException: не удалось вызвать закрытый com.pew.pew.base.networking.Either () без аргументов
А также
Caused by: java.lang.InstantiationException: Can't instantiate abstract class com.pew.pew.base.networking.Either
Есть ли способ инкапсулировать Error и Result в ответ на модификацию?
EDIT
Теперь у меня есть другой запечатанныйclass
sealed class Result<T> {
data class Success<T>(val data: T) : Result<T>()
data class Unauthorized(val exception: Exception) : Result<Nothing>()
data class Timeout(val exception: Exception) : Result<Nothing>()
data class Error(val exception: Exception) : Result<Nothing>()
}
fun <A, B> Result<A>.map(mapper: (A) -> B): Result<out B> {
return when (this) {
is Success -> Success(mapper(data))
is Unauthorized -> Unauthorized(exception)
is Timeout -> Timeout(exception)
is Error -> Error(exception)
}
}
И затем в моем RepositoryImpl мне нужно определить, является ли это успехом или ошибкой. Как мне это сделать? До того, как я использовал фолд, это позволило мне получить успех или ошибку.
Могу ли я сделать что-то вроде изменения с Call<T>
на Result<T>
?
inline fun <reified T> execute(f: () -> Call<T>): ResultWrapper<T> =
try {
when (T::class) {
Unit::class -> f().execute().let {
ResultWrapper.Success(Unit as T)
}
else -> f().execute().body()?.let {
ResultWrapper.Success(it)
} ?: ResultWrapper.Error(Throwable())
}
} catch (exception: Exception) {
ResultWrapper.Network(serverError)
}
Но там написано