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

时间:2019-01-18 08:16:55

标签: java android-studio intellij-idea kotlin android-studio-3.0

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文件:Observable.unsafeCreate{},然后在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文件中一样?


[UPDATE] 似乎是由于call()中的rx.functions.Func1方法,它具有参数t

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

2 个答案:

答案 0 :(得分:5)

我正在使用

  

Android Studio 3.2.1

     

rxjava:2.2.0

     

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

*.kt文件中输入Observable.unsafeCreate{}并在{}之间按 Ctrl + Space 后,Android Studio向我显示了下一条建议:

enter image description here

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

我没有在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。如果我们查看 RxJava 1.3 中的rx.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);
}

因此参数称为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的建议基于您要实现为lambda的Functional接口方法的参数名称。

答案 1 :(得分:4)

实际上Intellij可以在Java方面为您提供帮助,但在Kotlin方面尚无帮助。

subscriber-参数名源自扩展接口的通用类型,即Subscriber来自interface OnSubscribe<T> extends Action1<Subscriber<? super T>>

但是,在Kotlin方面未应用此机制,因此代码完成会建议您使用实现函数的参数,在这种情况下,该参数来自Action1#call(T t),因此仅为t。 / p>

您可以通过仅举一个基本示例来测试它是否使用通用类型信息:

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,其他框式类型(LongInteger等)前面是a(例如aLong;当然,否则您将使用保留字。

如果您想知道那里的源代码中发生了什么,您可能要遍历Intellij community source code,对于Android Studio,则可能要先遍历Building Android Studio

编辑:我应该改为添加Kotlin插件代码;-)如果您想改善Kotlin的完成建议,则可能需要看看JetBrains/kotlin/idea/idea-completion。此外,JetBrains/kotlin/idea/src也许也值得一看,您可能最终会看到所有的JetBrains/kotlin/idea-packages;-)