Несоответствие типов: предполагаемый тип - Any, кроме List <SportNewsResponse>? ожидалось - PullRequest
1 голос
/ 06 ноября 2019

Я занимаюсь разработкой новостного приложения и получаю следующую ошибку в своем классе MainViewModel.kt Несоответствие типов: выведенный тип - Любой, кроме Списка? ожидалось

ниже My MainViewModel.kt

class MainViewModel(
    private val sportNewsInterface: SportNewsInterface

) : ViewModel(), CoroutineScope {
    // Coroutine's background job
    private val job = Job()
    // Define default thread for Coroutine as Main and add job
    override val coroutineContext: CoroutineContext = Dispatchers.Main + job

    private val showLoading = MutableLiveData<Boolean>()
    private val sportList = MutableLiveData <List<SportNewsResponse>>()
    val showError = SingleLiveEvent<String>()

    fun loadNews() {
        // Show progressBar during the operation on the MAIN (default) thread
        showLoading.value = true
        // launch the Coroutine
        launch {
            // Switching from MAIN to IO thread for API operation
            // Update our data list with the new one from API
            val result = withContext(Dispatchers.IO) { sportNewsInterface.getNews()
            }
            // Hide progressBar once the operation is done on the MAIN (default) thread
            showLoading.value = false
            when (result) {


                is UseCaseResult.Success<*> -> {
                    sportList.value = result.data
                }
                is UseCaseResult.Error -> showError.value = result.exception.message
                 }
                }
            }



    override fun onCleared() {
        super.onCleared()
        // Clear our job when the linked activity is destroyed to avoid memory leaks
        job.cancel()
    }
}

ниже UserCaseResult.kt

sealed class UseCaseResult<out T : Any> {
    class Success<out T : Any>(val data: T) : UseCaseResult<List<SportNewsResponse>>()

    class Error(val exception: Throwable) : UseCaseResult<Nothing>()
}

1 Ответ

0 голосов
/ 06 ноября 2019

Взгляните на свой Success класс. Вы определяете val data с универсальным типом T, который ограничен сверху Any. А в блоке when, когда вы хотите проверить, является ли он экземпляром UseCaseResult.Success или нет, вы используете проекцию звезды, в результате чего компилятор выводит результат с верхней границей: UseCaseResult.Success<Any>. Таким образом, тип result.data будет выведен как Any.

Решение будет следующим:

  • Если UseCaseResult.Success содержит только данные, напечатанные в списке, выследует опустить универсальный тип (в настоящее время универсальный тип в вашем определении класса Success не имеет смысла):

    class Success(val data: List<SportNewsResponse>) : UseCaseResult<List<SportNewsResponse>>()
    

    или:

    class Success<out T: Any>(val data: List<T>) : UseCaseResult<List<T>>()
    
  • Или выможно просто изменить выражение когда на это:

    is UseCaseResult.Success<List<SportNewsResponse>> -> {
                        sportList.value = result.data
                    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...