问题标签 [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.

0 投票
2 回答
2908 浏览

java - @JvmSynthetic 在 Kotlin 中的预期用途是什么?

@JvmSynthetic我在 kotlin-stdlib 中遇到过注释,我想知道它的用途,但不幸的是,它没有记录。(UPD:就在那一刻)

据我了解,将其应用于程序元素会将synthetic修饰符添加到相应的字节码元素中。结果,该元素在 Java 中变得不可见:

Java代码中的某处:

但是在 Kotlin 代码中仍然可以看到相同的元素:

隐藏来自非 Kotlin 来源的声明是否有效使用@JvmSynthetic? 是预期用途吗?其他合适的用例是什么?

由于@JvmSynthetic隐藏了 Java 中的函数,因此它们也不能在 Java 中被覆盖(当涉及到abstract成员时,调用结果会变成AbstractMethodError)。鉴于此,我可以@JvmSynthetic用来禁止在 Java 源代码中覆盖 Kotlin 类的成员吗?

0 投票
1 回答
588 浏览

kotlin - Vert.x Kotlin 类型不匹配所需的处理程序> 找到(处理程序>) -> 单位

以下是从 Java 用 Kotlin 重写的方法:

但是,当我这样称呼它时:

我得到错误Type Mismatch required Handler<AsyncResult<Unit>> found (Handler<AsyncResult<Unit>>) -> Unit

我究竟做错了什么?

0 投票
1 回答
1351 浏览

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 编译器本身中修复吗?

0 投票
2 回答
1593 浏览

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

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

java中的函数看起来像这样

在我看来,这$receiver使得 Java 互操作感觉生成且不受欢迎。

我知道您可以将@JvmName注释与某些组合一起使用,例如@file:JvmName更改 java 中的名称。

当我尝试@JvmNamereceiver站点目标一起使用时,它说

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

有没有办法克服这个问题并更改接收者的名称,如果没有,最好的选择是什么。

0 投票
1 回答
407 浏览

clojure - Clojure:gen-class并在java中导入;包、路径、类路径

我想调用从 Java 编译为类的 Clojure 代码。

Clojure 类:

编译lein uberjar输出 -standalone.jar 并将其复制到 subdirs 下的 Java 项目中de/wt

.java 文件:

现在当我尝试编译

在命名文件/包、创建目录和设置类路径时,我需要遵循什么方案?

0 投票
3 回答
10395 浏览

java - Kotlin 方法重载

以下声明在 Kotlin 中是合法的。

作为字节码,我们得到:

也可以从 Kotlin 调用这两种方法。

当我尝试从 Java 中调用它们中的任何一个时,问题就出现了:

暧昧的呼唤。两种方法都匹配...

如何避免这样的问题?如何处理这样的方法?如果 3-rd 方 kt 库有同样的问题怎么办?

上面的例子是一个合成的例子。

0 投票
1 回答
314 浏览

java - 从 .Net 调用 Java 方法

我必须从 C# .Net concole 应用程序中调用 java 方法。

以下链接中的解决方案

不允许从 jar 文件到 .Net 控制台应用程序的有用返回值(例如字符串对象)。

另一种方法可能是使用IKVM,但开发已经结束,用于稳定的企业解决方案似乎已经过时了。

如何调用 java 方法和 geta 字符串作为结果值?

0 投票
1 回答
105 浏览

java - 在空手道中,将 Java 函数包装在 JavaScript 函数中有什么好处?

我可以像这样包装一个Java函数:

但我为什么要?我可以直接在测试场景中使用 Java 函数,如下所示:

注意:exec是一种静态方法,它使用 shell 来执行给定的命令。

至少我对静态方法进行了测试,并且在没有 JavaScript 绕道的情况下可以正常工作。JavaScript 包装器似乎只是增加了一层额外的复杂性。除此之外,使用“调用”语法我只能传递一个参数(诚然可以是整个对象或数组)。但是,我可以将参数直接传递给 Java 函数(使用普通语法),甚至可以在匹配中使用结果。(我假设参数和结果被隐式转换为 JavaScript 值,可能是 JSON 对象或数组)。

到目前为止,我还没有看到在 JavaScript 包装器中显式包装 Java 代码的优势。我认为问题出在我身上,那就是:我在这里遗漏了一些重要的点?