Intereting Posts
Отражение Котлина: параметр неизвестного типа kotlin springboot application – почему нет функции с выражением тела? Android Studio 3 не может построить фрагмент kotlin Нет аргументов типа, ожидаемых для fun findViewById (p0: Int): View Kotlin Generics: Котлин не признает мой класс с правильным наследованием напишите шестнадцатеричный целочисленный литерал, равный Int.MIN_VALUE в Котлине Альтернатива перегрузкам функций Класс абстрактных обобщений Котлина Kotlin / Android – KotlinReflectionInternalError в классе данных с лямбдой Ошибка: ошибка: разрешены только безопасные (?.) Или непустые (!!.) Вызовы в приемнике с нулевым значением типа View? Элементы RecyclerView не отображаются, пока я не прокручу его Запись функции использования Kotlin, которая обеспечивает самооценку в инициализаторе Как получить KProperty1 из KProperty0 Как добиться чистой функции с динамическим программированием в Котлине? Kotlin: Обязательно: kotlin.Boolean. Найдено: kotlin.Boolean?

Ограничение генерации Котлина

Я хочу создать класс, который может принимать ограниченный общий тип, так что мой класс может принимать только подкласс определенного класса. Но без так много броска. Мой код выглядит так:

open class SomeClass<V> where V : SomeType { private val vc: PS<SomeType> = PS.create() protected val z: ZQ<V> = vc.doSmt(-1).map { it as V } open fun onVc(v: V) { vc.on(v) } } 

С этим кодом предупреждение, по-видимому, использовалось in дисперсии для общего типа. Переход к SomeClass<in V> . Но когда я вызываю onVc(v) где v является подтипом SomeType , он отклоняется. v – тип Nothing . Я прочитал общую документацию kotlin здесь https://kotlinlang.org/docs/reference/generics.html, но все еще запутался.


Редактировать:

Я все равно поставлю исходный код и добавлю здесь более качественный и репрезентативный код.

 open class SomeClass<V> (params: IgnoreThis) where V: SomeType { private val vc: PublishSubject<SomeType> = PublishSubject.create() protected val z: Observable<V> = vc.filter { it !is SubClassOfSomeType }.map { it as V } open fun onVc(v: V) { vc.onNext(v) } } 

И это SomeType , его супер и подкласс выглядит

 interface SuperSomeType<S> { fun x(): Observable<S> } interface SomeType : SuperSomeType<EnumType1> interface SomeOtherType : SuperSomeType<EnumType2> // just to show why I used SuperSomeType interface class SubClassOfSomeType : SomeType { override fun x(): Observable<EnumType1> { return Observable.empty() } } 

Спасибо за предложение сделать его более понятным