Как заменить параметр "t" на "className"? - PullRequest
0 голосов
/ 18 января 2019
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 file: Observable.unsafeCreate{} и затем нажимаю Ctrl+Space между {}, тогда IntellijIdea предлагает мне ввести символ t ->, но когда я делаю то же самое в .java файл получен subscriber ->:

*.kt файл:

fun anyFunc(): Observable<Boolean>{
    return Observable.unsafeCreate { t -> t }
}

enter image description here

*.java file:

public void anyFunc() {
    Observable.unsafeCreate(subscriber -> {});
}

Как сделать так, чтобы в файле Kotlin вводилось такое же поведение, как в Java-файле?


[ОБНОВЛЕНИЕ] Кажется, это из-за метода call() в rx.functions.Func1, у него есть параметр t:

public interface Func1<T, R> extends Function { 
    R call(T t); 
}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

На самом деле Intellij помогает вам на стороне Java, но не (пока) на стороне Kotlin.

Имя subscriber -параметра получено из универсального типа расширенного интерфейса, то есть Subscriber из 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 ; -)

0 голосов
/ 21 января 2019

Я использую

Android Studio 3.2.1 ,

rxjava: 2.2.0 ,

Плагин Kotlin версии 1.3.11-release-Studio3.2-1

После ввода *.kt файла: Observable.unsafeCreate{} и нажатия Ctrl + Пробел между {} Android Studio показывает следующее предложение:

enter image description here

То же самое предложение Android Studio показывает, когда я набираю *.java файл.

Я не вносил никаких изменений в настройки Android Studio.

Я полагаю, вы импортируете Observable из rx - первый элемент в списке завершения на изображении ниже. Попробуйте импортировать Observable из io.reactivex - выделенный элемент в списке завершения ниже, это может помочь: import io.reactivex.Observable.

enter image description here

Для его использования необходимо импортировать 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 имеет следующую подпись:

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 основано на имени параметра метода функционального интерфейса, который вы реализуете как лямбда.

...