Как заменить параметр "t" на "className"?
Android Studio 3.2.1
Kotlin plugin version 1.3.11-release-Studio3.2-1
ext.kotlin_version = '1.3.11'
RxJava 1.3.0
Например, когда я *.kt
в *.kt
file: Observable.unsafeCreate{}
и затем *.kt
Ctrl+Space
между {}
, IntellijIdea предлагает мне ввести символ t ->
, но когда я делаю то же самое в .java
файле, результатом является subscriber ->
:
*.kt
файл:
fun anyFunc(): Observable<Boolean>{
return Observable.unsafeCreate { t -> t }
}
*.java
файл:
public void anyFunc() {
Observable.unsafeCreate(subscriber -> {});
}
Как сделать, чтобы в файле Kotlin было такое же поведение ввода текста, как в файле Java?
[ОБНОВЛЕНИЕ] Кажется, что это из-за метода call()
в rx.functions.Func1
, у него есть параметр t
:
public interface Func1<T, R> extends Function {
R call(T t);
}
Ответы
Ответ 1
я использую
Android Studio 3.2.1,
rxjava: 2.2.0,
Плагин Kotlin версии 1.3.11-release-Studio3.2-1
После ввода файла *.kt
: Observable.unsafeCreate{}
и нажатия клавиш Ctrl + Пробел между {}
Android Studio отображается следующее предложение:
То же самое предложение Android Studio показывает, когда я набираю *.java
файл.
Я не делал никаких изменений в настройках Android Studio.
Я предполагаю, что вы импортируете Observable
из rx
- первый элемент в списке завершения на изображении ниже. Попробуйте импортировать Observable
из io.reactivex
- выделенный элемент в списке завершения ниже, это может помочь: import io.reactivex.Observable
.
Чтобы использовать его, вам нужно импортировать rxjava2:
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
РЕДАКТИРОВАТЬ:
Как выяснилось, диалог завершения кода показал t ->
потому что параметр в Action1.call(T t)
вызвал t
. Мы можем увидеть, если мы посмотрим на подпись rx.Observable.unsafeCreate
метода в RxJava 1.3:
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
return new Observable<T>(RxJavaHooks.onCreate(f));
}
Интерфейс OnSubscribe
расширяет Action1<Subscriber<? super T>
Action1<Subscriber<? super T>
, а Action1
имеет следующую подпись:
public interface Action1<T> extends Action {
void call(T t);
}
Таким образом, параметр называется t
и Android Studio предлагает его как t ->
.
В RxJava2 у нас другая подпись:
public static <T> Observable<T> unsafeCreate(ObservableSource<T> onSubscribe) {...}
public interface ObservableSource<T> {
void subscribe(@NonNull Observer<? super T> observer);
}
Мы видим, что в ObservableSource.subscribe()
параметр метода называется observer
, поэтому мы видим его как observer->
.
Вывод: предложение IDEA основано на имени параметра метода функционального интерфейса, который вы реализуете как лямбда.
Ответ 2
На самом деле Intellij помогает вам на стороне Java, но не (пока) на стороне Kotlin.
Имя -параметра subscriber
получено из универсального типа расширенного интерфейса, то есть Subscriber
из interface OnSubscribe<T> extends Action1<Subscriber<? super T>>
interface OnSubscribe<T> extends Action1<Subscriber<? super T>>
.
Со стороны Kotlin, однако, этот механизм не применяется, и поэтому завершение кода предлагает вместо этого параметр реализующей функции, который в данном случае происходит из Action1#call(T t)
, так что просто t
.
Вы можете проверить, что он использует информацию общего типа, просто сделав простой пример:
class CustomObject {}
interface MyCustomConsumer extends Consumer<CustomObject> { }
static void test(MyCustomConsumer mcs) { }
public static void main(String[] args) {
test( // <- place cursor here and start code completion and you should get "customObject"
Обратите внимание, что для некоторых типов он адаптирует именование, например, String
становится s
а другим коробочным типам (Long
, Integer
и т.д.) Предшествует a
(например, aLong
; конечно, в противном случае вы бы использовали зарезервированное слово).
Если вам интересно, что там происходит в исходном коде, вы, возможно, захотите просмотреть исходный код сообщества Intellij, или для Android Studio вы можете сначала пройтись по сборке Android Studio.
РЕДАКТИРОВАТЬ: я должен был бы добавить код плагина Kotlin вместо ;-) если вы хотите улучшить предложения по завершению для Kotlin, вы можете взглянуть на JetBrains/kotlin/idea/idea-complete. Кроме того, JetBrains/kotlin/idea/src также стоит посмотреть, и вы, вероятно, в конечном итоге посмотрите на все пакеты JetBrains/kotlin/idea-packages ;-)
Ответ 3
Смотрите официальный документ для Observable Class, который использует:
io.reactivex.Observable<T>
И более подробно unsafeCreate:
Возвращает Observable, которое выполняет данное действие OnSubscribe для каждого отдельного подписчика, который подписывается; отмена подписки и обратное давление должны быть реализованы вручную.
public static <T> Observable<T> unsafeCreate(Observable.OnSubscribe<T> f)
Ответ 4
Я полагаю, что это может быть совершенно неправильно, но для печати метода, выполняемого в Java, я использую что-то вроде этого:
System.out.println((new Throwable()).getStackTrace()[0].toString());
Вы можете использовать это здесь?