Как заменить параметр "t" на "className"? - программирование

Как заменить параметр "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 }
}

enter image description here

*.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); 
}
4b9b3361

Ответ 1

я использую

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

Вы можете использовать это здесь?