如何将参数“t”替换为“类名”?

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 

例如,当我输入file:然后按beten,然后IntellijIdea建议我键入符号,但是当我在文件中做同样的事情时,结果是:*.ktObservable.unsafeCreate{}Ctrl+Space{}t ->.javasubscriber ->

*.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.Func1t

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

答案 1

我正在使用

安卓工作室 3.2.1

rxjava:2.2.0

Kotlin 插件版本 1.3.11-release-Studio3.2-1

输入文件后:并在Android Studio之间按Ctrl +空格键,将显示下一个建议:*.ktObservable.unsafeCreate{}{}

enter image description here

Android Studio在我输入文件时显示的建议相同。*.java

我没有在Android Studio Preferences中进行任何配置更改。

我猜你正在导入 - 下图中完成列表中的第一项。尝试从 - 下面的完成列表中突出显示的项目导入,它可能会有所帮助:.ObservablerxObservableio.reactiveximport io.reactivex.Observable

enter image description here

要使用它,你需要导入rxjava2:

implementation 'io.reactivex.rxjava2:rxjava:2.2.0'

编辑

如图所示,代码完成对话框显示,因为参数在中调用。如果我们看一下RxJava 1.3中方法的签名,我们可以看到它:t ->Action1.call(T t)trx.Observable.unsafeCreate

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

因此,参数被调用,Android Studio建议将其作为.tt ->

RxJava2 中,我们有不同的签名:

public static <T> Observable<T> unsafeCreate(ObservableSource<T> onSubscribe) {...}

public interface ObservableSource<T> {
    void subscribe(@NonNull Observer<? super T> observer);
}

我们看到在方法中参数被称为,所以我们把它看作。ObservableSource.subscribe()observerobserver->

结论:IDEA的建议是基于您正在实现为lambda的功能接口方法的参数名称。


答案 2

实际上,Intellij在Java方面帮助你,但在Kotlin方面(还没有)。

-parameter-name 派生自扩展接口的泛型类型,即 从。subscriberSubscriberinterface 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"

请注意,对于某些类型,它会调整命名,例如 become 和其他盒装类型 (, 等) 前面有一个 (例如;当然,否则你会使用保留字)。StringsLongIntegeraaLong

如果你好奇源代码中发生了什么,你可能想通过Intellij社区源代码,或者对于Android Studio,你可能想先通过Building Android Studio

编辑:我应该添加Kotlin插件代码;-)如果你想改进Kotlin的完成建议,你可能想看看JetBrains/kotlin/idea/idea-complete。此外,JetBrains/kotlin/idea/src可能也值得一看,你可能最终会看到所有的JetBrains/kotlin/idea-package。 ;-)


推荐