Несоответствие типов: предполагаемый тип - List <Any?>, Но ожидается, что List <Nothing> - PullRequest
0 голосов
/ 15 января 2019

У меня есть следующий Call интерфейс, который является инвариантным, и в другом классе я хочу вызвать одну из его функций, но я получаю следующую ошибку в этой строке currentCall?.refresh(result).

Type mismatch: inferred type is List<Any?> but List<Nothing> was expected.
Projected type Call<*>? restricts use of public abstract fun refresh(list: List<T>): Unit defined in 

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

Что бы вы сделали в этом случае? Как бы вы обновили данные, например?

interface Call<T> {
    fun provider(): Provider<T>
    fun items(): List<T>
    fun refresh(list: List<T>)
}

interface Provider<T> {
    fun enqueue(result: (List<T>) -> Unit)
}

class Main {

    private var currentCall: Call<*>? = null

    fun <T> add(provider: Provider<T>){}

    fun onStart() {
        currentCall?.provider()?.enqueue { result ->
            currentCall?.refresh(result)
        }
    }
}

1 Ответ

0 голосов
/ 15 января 2019

У вас есть кое-что, что я не совсем понимаю (что может быть ошибкой). В настоящее время не имеет смысла, что у вас есть currentCall типа Call<*> и общий метод add, потому что вы никак не можете установить provider для currentCall.

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

class Main<T> {

Затем вы можете безопасно удалить общий параметр из add:

fun add(provider: Provider<T>){}

И, наконец, вы можете заменить звездную проекцию currentCall на параметр типа generic T:

private var currentCall: Call<T>? = null

Что оставляет вас с классом вроде:

class Main<T> {

    private var currentCall: Call<T>? = null

    fun add(provider: Provider<T>){}

    fun onStart() {
        currentCall?.provider()?.enqueue { result ->
            currentCall?.refresh(result)
        }
    }
}

Это работает, потому что вы явно указываете компилятору, что каждый тип, который вы используете в Main , должен быть как-то связан с T.

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