Ошибка вывода типа: недостаточно информации для вывода параметра T Kotlin - PullRequest
0 голосов
/ 26 июня 2019

Я использую закрытый класс для возврата данных из сети.но когда я строю проект, я получаю следующую ошибку

Вывод типа не выполнен: недостаточно информации для вывода параметра T в забавной ошибке (errorMessage: String, error: Throwable): State Укажите егов явном виде.

Что мне здесь не хватает?

Вот код

suspend fun getdataFromApi(context: Context?, token: String?): State<ScheduleReminderListResponse> =
    withContext(schedulerProvider.io)
    {

            try {
                val list = network.getScheduleReminderList(token).await()
                schedeleReminderListLocalDao.insertAll(list)
                return@withContext State.success(list)
            } catch (e: Exception) {
                return@withContext State.error( e.message ?: "Unknown Error",  e  )
            }


        }






sealed class State<T> {

class Loading<T>: State<T>()
data class Error<T>(val errorMessage: String?, val error: Throwable): State<T>()
data class Success<T>(var data: T) : State<T>()

companion object {
    fun <T> loading(): State<T> =
        Loading()

    fun <T> error(errorMessage: String, error: Throwable): State<T> =
        Error(errorMessage, error)

    fun <T> success(data: T): State<T> =
        Success(data)

   }
 }

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

В этой строке State.error( e.message ?: "Unknown Error", e ) компилятор не знает, каким должен быть T.Если вы сравните его с success, вы увидите, что вы явно указали аргумент T, который компилятор использует для вывода типа.Вы можете указать это так при вызове error:

State.error<TYPE_OF_SCHEDULE_REMINDER_LIST>( e.message ?: "Unknown Error",  e  )

Поскольку вы не используете T в Error, вы, вероятно, захотите удалить его полностью из запечатанного класса и использовать его только там, гдеэто имеет смысл.

sealed class State {

    object Loading : State()
    data class Error(val errorMessage: String?, val error: Throwable) : State()
    data class Success<T>(var data: T) : State()

    companion object {
        fun loading(): State = Loading

        fun error(errorMessage: String, error: Throwable): Error =
            Error(errorMessage, error)

        fun <T> success(data: T): Success<T> = Success(data)
    }
}
1 голос
/ 26 июня 2019

Класс данных Error определяет параметр типа T, но не использует его никоим образом.Поэтому, когда вы создаете экземпляр Error, компилятор не может определить, какой тип следует использовать для T.

Чтобы исправить это, измените определения State и Error такчто у них нет параметра типа.

0 голосов
/ 27 июня 2019

В ответе на @ s1m0nw1 ответ , если вы хотите сохранить параметр типа в модели State (чтобы возвращаемые значения были красивыми и безопасными для типа), вы могли бы рассмотреть маркировку T как out и использовать Nothing в подклассах, которые его не используют

sealed class State<out T> {

    object Loading: State<Nothing>()
    data class Error(val errorMessage: String?, val error: Throwable): State<Nothing>()
    data class Success<T>(var data: T): State<T>()

    companion object {
        fun <T> loading(): State<T> = Loading

        fun <T> error(errorMessage: String, error: Throwable): State<T> = Error(errorMessage, error)

        fun <T> success(data: T): State<T> = Success(data)
    }
}

таким образом, ваш пример метода останется прежним, и вам не нужно будет выполнять небезопасные приведения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...