【问题标题】:How to replace param "t" to "className"?如何将参数“t”替换为“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 上似乎有答案。

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


【解决方案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 -&gt;,因为Action1.call(T t) 中的参数称为t。如果我们查看 RxJava 1.3rx.Observable.unsafeCreate 方法的签名就可以看到:

public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
    return new Observable<T>(RxJavaHooks.onCreate(f));
}

OnSubscribe 接口扩展了Action1&lt;Subscriber&lt;? super T&gt;,并且Action1 具有下一个签名:

public interface Action1<T> extends Action {
    void call(T t);
}

所以参数称为t,Android Studio 建议它为t -&gt;

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-&gt;

结论: IDEA 的建议是基于您作为 lambda 实现的函数式接口方​​法的参数名称。

【讨论】:

  • 我添加了有问题的屏幕截图...在我的情况下是t -&gt;
  • 我的代码补全设置是一样的
  • 我猜问题出在您正在使用的 RxJava 库中,特别是 1.3 版。我已经编辑了我的答案,使用来自 RxJava2 的 Observable 将反映正确的代码完成。
  • 似乎是因为public interface Func1&lt;T, R&gt; extends Function { R call(T t); }
  • 是的,好像是这样。在RxJava2 参数中称为observer,所以在代码完成中我们将其视为observerpublic interface ObservableSource&lt;T&gt; { void subscribe(@NonNull Observer&lt;? super T&gt; observer); }
【解决方案2】:

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

subscriber-parameter-name 派生自扩展接口的泛型类型,即 Subscriber 来自 interface OnSubscribe&lt;T&gt; extends Action1&lt;Subscriber&lt;? super T&gt;&gt;

但在 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 并且其他盒装类型(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 ;-)

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多