Kotlin: Непроверенный актерский состав: Запечатайте класс для своего дочернего класса (с универсальным). Как это предотвратить? - PullRequest
0 голосов
/ 02 мая 2018

У меня when на seal class, где я использую, чтобы проверить, относится ли он к определенному классу, я буду использовать данные. Он имеет общий T, как показано ниже.

sealed class State
object Empty : State()
class Load<T>(val presentable: Presentable<T>) : State()
class Data<T>(val presentable: Presentable<T>) : State()

class LoadableContentController<T>(
        private val presenter: LoadableContentPresenter<T>) {

    private var state: State = Empty

    fun present(content: Presentable<T>?) {
        this.state = if (content == null) {
            Empty
        } else {
            Data(content)
        }
        this.performSideEffects()
    }

    private fun performSideEffects() {
        when (this.state) {
            is Data<*> -> {
                presenter.present((state as Data<T>).presentable)
            }
            is Load<*> -> {
                presenter.present((state as Load<T>).presentable)
            }
        }
    }
}

interface LoadableContentPresenter<T> {
    fun present(presentable: Presentable<T>)
}

interface Presentable<T> {
    val TAG: String
    fun createView(): () -> T
}

Код работает. Однако это жалобы Unchecked cast: State to Load<T> на ниже.

presenter.present((state as Load<T>).presentable) 

Есть ли способ предотвратить предупреждение или сделать автоматическое приведение (поэтому мне не нужно его разыгрывать)?

1 Ответ

0 голосов
/ 02 мая 2018

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

sealed class State<out T>
object Empty : State<Nothing>()
class Load<T>(val presentable: Presentable<T>) : State<T>()
class Data<T>(val presentable: Presentable<T>) : State<T>()

А в вашем классе:

class LoadableContentController<T>(
        private val presenter: LoadableContentPresenter<T>) {

    private var state: State<T> = Empty

    private fun performSideEffects() {
        val state = this.state
        when (state) {
            is Data<T> -> {
                presenter.present(state.presentable)
            }
            is Load<T> -> {
                presenter.present(state.presentable)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...