问题标签 [kotlin-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 投票
0 回答
439 浏览

kotlin - 在 Kotlin 中覆盖 Java final 函数的 Kotlin 编译器问题

我正在处理 Kotlin/Java 编译器的以下问题。想象一下下面的场景:假设First是一个带有 final 函数的 Java 类,并且Second是一个 Kotlin 类,它扩展First了一个与类中的 final 函数同名的函数First,例如:

显然,这是错误的,因为最终函数foo()不能被覆盖。但是,编译成功通过并且在运行时我得到java.lang.LinkageError: Method void Second.foo() overrides final method in class First. 这是编译器的正确行为吗?我想这个案例会有一些验证。谢谢!

0 投票
0 回答
57 浏览

kotlin - 如何从 Kotlin 引用 java.awt.Dimension 的公共字段

在 Kotlin 中是否可以直接访问在 Java 类中声明的公共支持字段,如果该类恰好具有该字段的相应 getter?例如,JDKjava.awt.Dimension有字段widthand height,它们是public,但也有getWidth()andgetHeight()方法(尽管它们返回doubles 而不是ints,所以它们不是严格的“对应”getter)。这是一个示例代码:

Java 字节码清楚地显示了getWidth()被调用的方法,然后是一个double-to-int转换:

有趣的是,如果我替换widthgetWidth(),则代码无法编译,需要显式转换。

我使用 Kotlin v1.3.61

0 投票
1 回答
242 浏览

java - 在 Kotlin 中仅使用 getter 覆盖 Java 接口

我在Java中有这个接口:

我希望它在 Kotlin 代码中覆盖。我好像做不到。

这是我尝试过的:

在这里,我收到一个错误'<field> overrides nothing'

在这里,我得到同样的错误'<field> overrides nothing'

此代码有效,但看起来很脏:

有没有更好的方法来做到这一点?

0 投票
1 回答
120 浏览

kotlin - 如何在 Kotlin 中获取对 Java 超类的静态类的引用

我有示例第三方 Java 代码:

所以只有ApiClassStaticClass是公开的。在 Java 中,我可以参考StaticClassApiClass.StaticClass. 对于 Kotlin 中的相同代码,我得到了Unresolved reference: StaticClass. 我也无法通过 获得参考PackagePrivateClass,因为它是私有包(很明显)。是否有任何黑客可以参考StaticClass(它是第三方代码,所以我不能简单地制作 PackagePrivateClass public)?

我知道这可能是“设计使然”,但它禁止我使用 3p 代码

0 投票
1 回答
755 浏览

kotlin - 更新地图时,将地图从 Java 传递到 Kotlin 不会编译

我有一个 Java 函数,它有一个Map<String, String并且需要将其传递给 Kotlin 函数以向地图添加值。
问题是,如果我有:

似乎map是不可变的,我不能这样做:map[KEY] = VALUE因为我得到编译错误。
如果我这样做了,它会起作用:但在那种情况下,如果没有一些我想尽可能避免的转换,我就不能从 Java 代码fun updateMap(map: HashMap<String, String>)中传递原始代码。 解决方案是什么?map

0 投票
2 回答
173 浏览

java - Kotlin 挂起函数在调用 java 时丢失 ReactiveSecurityContext

当我进入挂起函数时,上下文是存在的。这个函数是从一个也是挂起的控制器函数中调用的。

一旦我进入java代码,上下文就在java中消失了。如果我回拨到 kotlin,安全上下文仍然消失了。

知道如何解决这个问题吗?

0 投票
2 回答
258 浏览

java - 如何在 Kotlin 中惯用地编写 Java 函数接口的默认方法?

我正在尝试以惯用方式转换 Kotlin 中称为责任链的设计模式的 Java 代码。但是我对appendNext()在 Kotlin 中转换 Java 接口的默认方法没有任何线索。我尝试了一些已经存在的问题,例如thisthis,但它们似乎不适用于我的用例。

我尝试将默认方法转换为appendNext()Kotlin 中的扩展函数。但显然 Kotlin 似乎没有找到方法Logger.message()并 throws NoSuchMethodError

我在以下片段中给出了迄今为止我尝试过的原始 Java 代码和 Kotlin 代码。

我更喜欢此代码的 Kotlin 惯用解决方案,而不使用@JvmDefault注释。代码应该和 Java 一样简洁。任何帮助将非常感激。

Java 代码

这是设计模式责任链的正确工作 Java 代码:

科特林代码

这是我到目前为止所尝试的。我将其Enum移至一个单独的文件并将所有内容都保留在顶层。看看appendNext()方法,这似乎是问题的原因。

记录器.kt

日志级别.kt

0 投票
4 回答
318 浏览

android - 在 Kotlin 中使用静态 Java 方法作为静态(或单例)属性

我的 SDK 公开了一个只有静态方法的 Java 接口,例如

在使用 SDK 的 Java 应用程序中,我的客户可以像使用单例一样使用它们,例如

当这个 SDK 被集成到 Kotlin 应用程序中时,很自然地将其表达为属性:

问题是,这个内置的互操作只适用于非静态方法。

我可以在 Kotlin 中创建一个单例并让它处理翻译:

但是,在其他纯 Java SDK 中的这个 Kotlin 文件不会对不使用 Kotlin 的客户产生负面影响吗?可以用Java表达吗?

或者我应该简单地将MyDevice.java转换为 Kotlin?对于仍在使用 Java 的客户,这样的步骤会有什么负面影响?

0 投票
1 回答
34 浏览

java - 从 java 中删除冗余 SAM 构造函数时,Kotlin 丢失了可空性信息

我在我的一个项目中使用 SendBird。其中一个函数用于连接sdk:

Kotlin 提示我可以将其转换为 lambda:

问题是 lambda 内部user是类型User!,而真正的类型User?有时会导致崩溃。

@NullableSendBird android sdk 是用 java 编写的,没有任何东西用/正确注释@NonNull。在保持可为空类型的同时使用 lambda 的任何方法User?

0 投票
1 回答
176 浏览

kotlin - 我可以在没有相应 getter 的情况下为 Java setter 使用属性语法吗?

我有一个带有 setter 的 Java 类,但没有属性的 getter。

我想.name=从 Kotlin 分配给它

unresolved reference: name尝试编译 Kotlin 时出现错误。如果我添加一个 getter,错误就会消失,但是我可以使用 setter 作为属性而不在 Java 中定义一个 getter 吗?我知道我仍然可以p.setName("example")从 kotlin 打电话。

以上是MCVE。真实世界的代码是一个 Java 构建器,带有 setter 但不是我想从 Kotlin 使用的 getter,比如