首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改kotlin扩展函数接收器JVM名称

更改kotlin扩展函数接收器JVM名称
EN

Stack Overflow用户
提问于 2017-12-12 23:14:57
回答 1查看 1.5K关注 0票数 8

这是一个一般性的问题。假设我有一个用kotlin编写的扩展函数,它将DP转换为PX并返回一个NonNull Int

代码语言:javascript
复制
fun Int.toPx() {  /** implementation */ }

java中的函数将如下所示

代码语言:javascript
复制
public int toPx(int $receiver) {  /** implementation */ }

在我看来,$receiver让Java-interop看起来像是生成的,不那么吸引人。

我知道您可以使用@JvmName注释和@file:JvmName等组合来更改java中的名称。

当我尝试对receiver站点目标使用@JvmName时,它显示

“此批注不适用于目标type usage和使用站点目标@receiver

有没有办法克服这一点并更改接收器的名称,如果没有,最好的替代方案是什么。

EN

回答 1

Stack Overflow用户

发布于 2018-08-09 16:33:23

参数名称只与Java文档相关(当您调用方法时,作为IDE中的方法签名提示)。与Kotlin不同,它从来不是调用代码的一部分。

如果您在现有类型上定义扩展方法,我发现一个不错的方法是以描述接收方的方式命名文件。虽然这对Kotlin来说无关紧要(因为调用扩展方法时没有文件名),但对于其他JVM语言却很重要。因此,接收器类型/含义不是由参数名表示的,而是由类名表示的。

您已经知道了@file:JvmName,所以使用它作为您的优势:

代码语言:javascript
复制
@file:JvmName("Ints")

fun Int.toPx() { ... }

在Kotlin:

代码语言:javascript
复制
val value = 328
val px = value.toPx()

在Java中,代码非常接近Kotlin对应的代码:

代码语言:javascript
复制
int value = 328;
Pixel px = Ints.toPx(value);

当然,可以是一个更长的名称,比如IntExtensions,如果这样有助于提高可读性的话。

注意,在Kotlin中,显式地允许跨多个文件重用@file:JvmName中的相同类名,并且扩展函数将被组合到一个单独的JVM类中(另请参阅here)。为此,您需要注释@file:JvmMultifileClass

因此,您也可以拥有一个与另一个文件中的像素完全无关的Int扩展名,但它仍然会以相同的Java类Ints结束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47775870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档