Функция расширения вызова внутри класса 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-кода?


person agonist_    schedule 11.09.2017    source источник
comment
Возможный дубликат Доступ к функциям расширения Kotlin из Java   -  person Dioxin    schedule 11.09.2017
comment
@VinceEmigh это не так, это другой вариант использования.   -  person agonist_    schedule 11.09.2017
comment
Функции расширения скомпилированы в статические методы, как указано в связанном дубликате. Это ответ. Если вы ищете обходной путь, укажите его. Как и в настоящее время, и вопрос, и ответ соответствуют дубликату (независимо от специфики, аналогично вопросам NPE). Бессмысленно отвечать на вопросы, которые незначительно отличаются друг от друга, без какой-либо реальной разницы, поскольку это не добавляет ценности, а только раздувает одни и те же вопросы и ответы.   -  person Dioxin    schedule 11.09.2017


Ответы (2)


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

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

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

EDIT: я полагаю, что вы уже знаете это, но все равно укажете вам на этот вопрос.

person Mustansir Zia    schedule 11.09.2017
comment
Если вы знаете, что этот вопрос был задан и на него был дан ответ, отметьте вопрос как дубликат. - person Dioxin; 11.09.2017
comment
Я полагаю, что он уже знал о решении, представленном в вопросе, и он хотел чего-то другого, чтобы иметь возможность использовать метод в потоке Rx после того, как он создаст экземпляр observable. Для вызова его пользовательских методов в экземпляре. Поэтому я ответил так, как ответил. - person Mustansir Zia; 11.09.2017
comment
Из его поста: И это та часть, с которой я застрял. Это вообще возможно? Из дубликата: Что я делаю неправильно? Это вообще возможно? - Как это не то же самое? Нам не нужно 3 миллиона копий одних и тех же вопросов. Отметьте как дубликат, ответьте на дубликат, если считаете, что их ответов недостаточно. Так работает сайт. - person Dioxin; 11.09.2017

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

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

person innov8    schedule 11.09.2017