如何将参数“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 -&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 ;-)

【讨论】:

以上是关于如何将参数“t”替换为“className”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式匹配 className 内的文本? [复制]

Clang如何处理MSVC的编译参数

泛型编程

如何将数字替换为空间参数

如何将带引号的多字字符串替换为参数?

我如何在gsub中读取参数