Котлин: приведение объекта в общий класс - PullRequest
2 голосов
/ 13 марта 2019

Как получить тип универсального класса и привести к нему объект?

Я хочу использовать эту функцию для передачи класса интерфейса:

protected fun <T> getInteraction(): T {
        return when {
            context is T -> context
            parentFragment is T -> parentFragment as T
            else -> throw IllegalArgumentException("not implemented interaction")
        }
    }

и используйте его как:

 private var interaction: ISigninInteraction? = null

 override fun onAttach(context: Context?) {
        super.onAttach(context)
        interaction = getInteraction<ISigninInteraction>()

 }

1 Ответ

2 голосов
/ 13 марта 2019

Kotlin, Java и JVM имеют стирание типов при реализации Generics.Обобщения не видны на уровне байт-кода.Это означает, что вы не можете использовать параметры типа, например T, непосредственно в коде функции.

Kotlin добавляет поддержку reified дженериков, что помогает здесь.Вы можете объявить функцию как

inline fun <reified T> getIt() : T {
  ...
}

. С помощью reified и inline можно будет привести к T и вернуть его.https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters

Вторая альтернатива - следовать практике Java - добавьте параметр Class<T> к функции и используйте Class#cast для приведения к T.

Вы можете комбинировать функцию reified inline с таким подходом, как:

inline fun <reified T> getIt() = getIt(T::class.java)
...