问题标签 [java-interop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - @JvmSynthetic 在 Kotlin 中的预期用途是什么?
@JvmSynthetic
我在 kotlin-stdlib 中遇到过注释,我想知道它的用途,但不幸的是,它没有记录。(UPD:就在那一刻)
据我了解,将其应用于程序元素会将synthetic
修饰符添加到相应的字节码元素中。结果,该元素在 Java 中变得不可见:
Java代码中的某处:
但是在 Kotlin 代码中仍然可以看到相同的元素:
隐藏来自非 Kotlin 来源的声明是否有效使用@JvmSynthetic
? 是预期用途吗?其他合适的用例是什么?
由于@JvmSynthetic
隐藏了 Java 中的函数,因此它们也不能在 Java 中被覆盖(当涉及到abstract
成员时,调用结果会变成AbstractMethodError
)。鉴于此,我可以@JvmSynthetic
用来禁止在 Java 源代码中覆盖 Kotlin 类的成员吗?
kotlin - Vert.x Kotlin 类型不匹配所需的处理程序> 找到(处理程序>) -> 单位
以下是从 Java 用 Kotlin 重写的方法:
但是,当我这样称呼它时:
我得到错误Type Mismatch required Handler<AsyncResult<Unit>> found (Handler<AsyncResult<Unit>>) -> Unit
。
我究竟做错了什么?
inheritance - 在 Kotlin 中扩展 Java 类时继承的平台声明冲突
我正在尝试使用 Kotlin 扩展第三方 Java 类,但我收到以下编译器消息:
继承的平台声明冲突:以下声明具有相同的 JVM 签名 (setCollection(Ljava/util/Collection;)V):
fun setCollection(collection:(Mutable)Collection<(raw)Any?>!: KotlinClass 中定义的单元
fun setCollection(collection:(Mutable)Collection<String!>!):在 KotlinClass 中定义的单元
无论我做什么,都无法仅使用 Kotlin 代码对其进行编译。
重现这种情况的代码:
Java 本身没有这个问题。所以我的猜测是这可能与平台类型有关(String!
不是Any?
)。
是否有针对此问题的优雅解决方法,最好不涉及编写 Java 代码?或者这应该在 Kotlin 编译器本身中修复吗?
java - 更改 kotlin 扩展函数接收器 JVM 名称
这是一个普遍的问题。假设我有一个用 kotlin 编写的扩展函数,它将 DP 转换为 PX 并返回一个 NonNull Int
java中的函数看起来像这样
在我看来,这$receiver
使得 Java 互操作感觉生成且不受欢迎。
我知道您可以将@JvmName
注释与某些组合一起使用,例如@file:JvmName
更改 java 中的名称。
当我尝试@JvmName
与receiver
站点目标一起使用时,它说
“此注释不适用于目标type usage
和使用站点目标@receiver
”
有没有办法克服这个问题并更改接收者的名称,如果没有,最好的选择是什么。
clojure - Clojure:gen-class并在java中导入;包、路径、类路径
我想调用从 Java 编译为类的 Clojure 代码。
Clojure 类:
编译lein uberjar
输出 -standalone.jar 并将其复制到 subdirs 下的 Java 项目中de/wt
。
.java 文件:
现在当我尝试编译
在命名文件/包、创建目录和设置类路径时,我需要遵循什么方案?
java - Kotlin 方法重载
以下声明在 Kotlin 中是合法的。
作为字节码,我们得到:
也可以从 Kotlin 调用这两种方法。
当我尝试从 Java 中调用它们中的任何一个时,问题就出现了:
暧昧的呼唤。两种方法都匹配...
如何避免这样的问题?如何处理这样的方法?如果 3-rd 方 kt 库有同样的问题怎么办?
上面的例子是一个合成的例子。
java - 在空手道中,将 Java 函数包装在 JavaScript 函数中有什么好处?
我可以像这样包装一个Java函数:
但我为什么要?我可以直接在测试场景中使用 Java 函数,如下所示:
注意:exec
是一种静态方法,它使用 shell 来执行给定的命令。
至少我对静态方法进行了测试,并且在没有 JavaScript 绕道的情况下可以正常工作。JavaScript 包装器似乎只是增加了一层额外的复杂性。除此之外,使用“调用”语法我只能传递一个参数(诚然可以是整个对象或数组)。但是,我可以将参数直接传递给 Java 函数(使用普通语法),甚至可以在匹配中使用结果。(我假设参数和结果被隐式转换为 JavaScript 值,可能是 JSON 对象或数组)。
到目前为止,我还没有看到在 JavaScript 包装器中显式包装 Java 代码的优势。我认为问题出在我身上,那就是:我在这里遗漏了一些重要的点?