如何将参数“t”替换为“className”?
Posted
技术标签:
【中文标题】如何将参数“t”替换为“className”?【英文标题】:How to replace param "t" to "className"? 【发布时间】:2019-06-12 11:34:05 【问题描述】: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 文件中相同的建议输入行为?
[更新]
似乎是因为rx.functions.Func1
中的call()
方法,它有参数t
:
public interface Func1<T, R> extends Function
R call(T t);
【问题讨论】:
在 Java 中,您必须为 lambda 参数提供一个名称,而在 Kotlin 中,lambda 中的单个参数有一个隐式名称it
。你可以简单地说unsafeCreate it
@s1m0nw1 我也知道it
。但我想要className
。在快速查看代码后,这将更易于阅读和理解
你用的是什么版本的Android Studio,RxJava?
@NickUnuchek - 这是你的问题吗? developerfaqs.com/5967/how-to-replace-param-t-to-classnamedeveloperfaqs.com 上似乎有答案。
【参考方案1】:
我正在使用
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 Preferences 中进行任何配置更改。
我猜你是从rx
导入Observable
- 下图中完成列表中的第一项。尝试从io.reactivex
导入Observable
- 下面完成列表中突出显示的项目,它可能会有所帮助: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 实现的函数式接口方法的参数名称。
【讨论】:
我添加了有问题的屏幕截图...在我的情况下是t ->
我的代码补全设置是一样的
我猜问题出在您正在使用的 RxJava 库中,特别是 1.3 版。我已经编辑了我的答案,使用来自 RxJava2 的 Observable
将反映正确的代码完成。
似乎是因为public interface Func1<T, R> extends Function R call(T t);
是的,好像是这样。在RxJava2
参数中称为observer
,所以在代码完成中我们将其视为observer
:public interface ObservableSource<T> void subscribe(@NonNull Observer<? super T> observer);
【参考方案2】:
实际上 Intellij 在 Java 方面可以帮助您,但在 Kotlin 方面还没有(还)。
subscriber
-parameter-name 派生自扩展接口的泛型类型,即 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 community source code 或Android Studio 您可能想先通过Building Android Studio。
编辑:我应该添加 Kotlin 插件代码 ;-) 如果您想改进 Kotlin 的完成建议,您可能需要查看 JetBrains/kotlin/idea/idea-completion。此外JetBrains/kotlin/idea/src 可能也值得一看,您可能最终会看到所有JetBrains/kotlin/idea-packages ;-)
【讨论】:
以上是关于如何将参数“t”替换为“className”?的主要内容,如果未能解决你的问题,请参考以下文章