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 }
}
*.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);
}
答案 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向我显示了下一条建议:
当我输入*.java
文件时,Android Studio会显示相同的建议。
我没有在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
。如果我们查看 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
,其他框式类型(Long
,Integer
等)前面是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;-)