У меня есть следующий класс:
abstract class PresenterActivity<S : ViewState, I : ViewIntent> : AppCompatActivity() {
open fun initViewIntent(): I {
return object : ViewIntent{} // type mismatch on this line
}
}
Я получаю сообщение о предварительной компиляции:
Type mismatch
Required: I
Found: <S, I>
Чтобы исправить эту предварительную -compilation error Я передаю объект ViewIntent в I:
abstract class PresenterActivity<S : ViewState, I : ViewIntent> : AppCompatActivity() {
open fun initViewIntent(): I {
@Suppress("UNCHECKED_CAST")
return object : ViewIntent{} as I
}
}
Но почему Kotlin не может обнаружить, что I
должен быть получен из ViewIntent
и smart cast it?
Просто потому, что "я" НЕ обязательно выводится из ViewIntent, но точно из класса ViewIntent.
Вы можете исправить это следующим образом:
Выполнение это ваш путь действительно небезопасный. Чтобы понять, почему, я думаю, вы должны начать читать это:
https://blog.kotlin-academy.com/kotlin-generics-variance -modifiers-36b82c7caa39 https://kotlinlang.org/docs/reference/generics.html https://proandroiddev.com/understanding-generics-and-variance-in -kotlin-714c14564c47
Это потому, что
ViewIntent
неI
. Пример: