Intereting Posts
Как я могу условно добавить асинхронную операцию в середине потока RxJava? Почему Kotlin не может вывести следующий аргумент лямбда (после преобразования Java -> Kotlin)? Упрощение добавления и замены фрагментов в Котлине Локальные функции доступа к родительским переменным с тем же именем Параметр функции Kotlin: Val не может быть переназначен Как объявить класс, содержащий поле с общим типом в Котлин? Kotlin: Локальная функция передается встроенным функциям как параметр inlined? Компилятор Kotlin для JavaScript в JavaScript? Проверьте, является ли функция расширением В Kotlin, как вы можете ограничить выбор в свободно Builder для разных видов настроек Преобразование кода с Java в Kotlin в Android Studio kotlin Неразрешенная ссылка только для одного унаследованного метода в деле делегирования Инструмент визуализации фигуры libGDX не рисуется после нажатия кнопки «Назад» kotlin неразрешенная ссылка KDoc, но IntelliJ не любит импорт, который его исправляет Kotlin: неоднозначность линейной лямбды и перегрузки

Функция расширения вызова внутри класса java как любой оператор RX

Я создал функцию расширения,

fun <T> Observable<T>.subscribeWithErrorHandling(onNext: (T) -> Unit ,onError: ((throwable: Throwable) -> Unit)? = null): Subscription { //doing stuff } 

в классе kotlin, я смогу использовать его без проблем таким образом

observable.subscribeWithErrorHandling(...)

Теперь я хочу использовать эту функцию и в своем классе java. Я уже вижу, что вы можете назвать это статически, как:

MyExtensionFile.subscribeWithErrorHandling

Но в моем случае вам нужно что-то еще, так как это средний поток RX. И та часть, с которой я застрял. Возможно ли это? или нет способа сделать что-то подобное из java-кода?

Простой ответ. No .

Объяснение. Я считаю, что это невозможно, поскольку это означает, что вы расширяете класс Observable который является абстрактным. Расширения Kotlin добавляют одну и ту же функциональность, перемещаясь из дерева наследования и на Java, вы в значительной степени застреваете с наследованием.

Таким образом, единственным вариантом будет расширение базового класса Observable и создание вашей собственной реализации того же самого, который, я думаю, будет нежелательным в вашем случае. Простым решением было бы создать новый метод только для Java, который может воспринимать наблюдаемый и выполнять требуемую логику. Или создайте собственный класс с экземпляром Observable качестве его экземпляра, а затем напишите необходимые методы внутри него (стандартный способ OOPS). Этот код можно было бы использовать из Kotlin, а также Java.

EDIT: Я думаю, вы уже знаете это, но все равно укажете вам на этот вопрос .

Расширение функции одно из преимуществ kotlin над Java. Кодирование в kotlin дает вам эти преимущества, но, к сожалению, это не значит, что вы можете использовать функции языка kotlin в Java-коде.

Решение: выгрузите модуль, где вы хотите использовать функции расширения в kotlin.