Intereting Posts
Почему небезопасный вызов .run () отлично работает при нулевом значении в Котлин? Kotlin JSR-223 ScriptEngineFactory в толстой банке – Не удается найти компилятор kotlin компилятора Сравнение двух вариантов в Котлине Могу ли я отложить привязку вида в адаптере с помощью расширения Kotlin Android Проблема генериков Котлина Как проверить видимость программной клавиатуры в Android? Объем переменной, определенной для заголовка цикла Как определить, является ли объект унаследованным от определенного класса в Котлине? Как создать пакетные функции? Как запустить тесты kotlintest с помощью gradle? Как реализовать проверенный конструктор в Котлине? Множественные значения не допускаются для опции плагина. Org.jetbrains.kotlin.android:package Как показать только день и месяц в диалоговом окне выбора даты в Kotlin (Android)? Kotlin: строка формата Проверить ожидаемые исключения в Котлине

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

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

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() } } 

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