【发布时间】:2018-01-07 18:06:57
【问题描述】:
我希望某些方法仅对 kotlin 代码可见,而对 Java 代码不可见。
比如这里有一个方法fun method(){},只能在kotlin代码中调用,不能在Java代码中调用。
【问题讨论】:
我希望某些方法仅对 kotlin 代码可见,而对 Java 代码不可见。
比如这里有一个方法fun method(){},只能在kotlin代码中调用,不能在Java代码中调用。
【问题讨论】:
您可以使用@JvmSynthetic 注释准确地实现您想要的。它在 JVM 字节码中用 synthetic flag 标记元素,它的使用在 Java 源代码中变成了一个错误(不太确定其他 JVM 语言,需要检查,但很可能它也可以工作):
@JvmSynthetic
fun f() { /*...*/ }
被标记的元素在 Kotlin 中仍然可以正常使用。
很遗憾,@JvmSynthetic 不能用于标记类(它没有 CLASS 目标)。
查看更多:
What's the intended use of @JvmSynthetic in Kotlin?(那里没有答案,但问题中描述了效果)
Inline function cannot access non-public-API: @PublishedApi vs @Suppress vs @JvmSynthetic,关于如何使用它来有效地隐藏公共内部成员。
【讨论】:
Kotlin 标准库中的某些方法使用 @kotlin.internal.InlineOnly 注释标记为 inline。这使得编译器可以将它们内联到 kotlin 代码中,而无需在 JVM 类中生成相应的方法。
此技巧用于减少 stdlib 上的方法计数。这是一个危险的解决方案,如果使用不当,可能会导致单独编译出现问题。
问题:@kotlin.internal.InlineOnly 注释是内部的,只能在标准库中使用。我知道没有将它发布到公共 API 中的计划。
TL;DR:你可以做到,但前提是你为 Kotlin 标准库做出贡献
【讨论】: