问题标签 [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.
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
. 这是编译器的正确行为吗?我想这个案例会有一些验证。谢谢!
kotlin - 如何从 Kotlin 引用 java.awt.Dimension 的公共字段
在 Kotlin 中是否可以直接访问在 Java 类中声明的公共支持字段,如果该类恰好具有该字段的相应 getter?例如,JDKjava.awt.Dimension
有字段width
and height
,它们是public
,但也有getWidth()
andgetHeight()
方法(尽管它们返回double
s 而不是int
s,所以它们不是严格的“对应”getter)。这是一个示例代码:
Java 字节码清楚地显示了getWidth()
被调用的方法,然后是一个double
-to-int
转换:
有趣的是,如果我替换width
为getWidth()
,则代码无法编译,需要显式转换。
我使用 Kotlin v1.3.61
java - 在 Kotlin 中仅使用 getter 覆盖 Java 接口
我在Java中有这个接口:
我希望它在 Kotlin 代码中覆盖。我好像做不到。
这是我尝试过的:
在这里,我收到一个错误'<field> overrides nothing'
在这里,我得到同样的错误'<field> overrides nothing'
此代码有效,但看起来很脏:
有没有更好的方法来做到这一点?
kotlin - 如何在 Kotlin 中获取对 Java 超类的静态类的引用
我有示例第三方 Java 代码:
所以只有ApiClass
和StaticClass
是公开的。在 Java 中,我可以参考StaticClass
:ApiClass.StaticClass
. 对于 Kotlin 中的相同代码,我得到了Unresolved reference: StaticClass
. 我也无法通过 获得参考PackagePrivateClass
,因为它是私有包(很明显)。是否有任何黑客可以参考StaticClass
(它是第三方代码,所以我不能简单地制作 PackagePrivateClass public
)?
我知道这可能是“设计使然”,但它禁止我使用 3p 代码
kotlin - 更新地图时,将地图从 Java 传递到 Kotlin 不会编译
我有一个 Java 函数,它有一个Map<String, String
并且需要将其传递给 Kotlin 函数以向地图添加值。
问题是,如果我有:
似乎map
是不可变的,我不能这样做:map[KEY] = VALUE
因为我得到编译错误。
如果我这样做了,它会起作用:但在那种情况下,如果没有一些我想尽可能避免的转换,我就不能从 Java 代码fun updateMap(map: HashMap<String, String>)
中传递原始代码。
解决方案是什么?map
java - Kotlin 挂起函数在调用 java 时丢失 ReactiveSecurityContext
当我进入挂起函数时,上下文是存在的。这个函数是从一个也是挂起的控制器函数中调用的。
一旦我进入java代码,上下文就在java中消失了。如果我回拨到 kotlin,安全上下文仍然消失了。
知道如何解决这个问题吗?
java - 如何在 Kotlin 中惯用地编写 Java 函数接口的默认方法?
我正在尝试以惯用方式转换 Kotlin 中称为责任链的设计模式的 Java 代码。但是我对appendNext()
在 Kotlin 中转换 Java 接口的默认方法没有任何线索。我尝试了一些已经存在的问题,例如this和this,但它们似乎不适用于我的用例。
我尝试将默认方法转换为appendNext()
Kotlin 中的扩展函数。但显然 Kotlin 似乎没有找到方法Logger.message()
并 throws NoSuchMethodError
。
我在以下片段中给出了迄今为止我尝试过的原始 Java 代码和 Kotlin 代码。
我更喜欢此代码的 Kotlin 惯用解决方案,而不使用@JvmDefault
注释。代码应该和 Java 一样简洁。任何帮助将非常感激。
Java 代码
这是设计模式责任链的正确工作 Java 代码:
科特林代码
这是我到目前为止所尝试的。我将其Enum
移至一个单独的文件并将所有内容都保留在顶层。看看appendNext()
方法,这似乎是问题的原因。
记录器.kt
日志级别.kt
android - 在 Kotlin 中使用静态 Java 方法作为静态(或单例)属性
我的 SDK 公开了一个只有静态方法的 Java 接口,例如
在使用 SDK 的 Java 应用程序中,我的客户可以像使用单例一样使用它们,例如
当这个 SDK 被集成到 Kotlin 应用程序中时,很自然地将其表达为属性:
问题是,这个内置的互操作只适用于非静态方法。
我可以在 Kotlin 中创建一个单例并让它处理翻译:
但是,在其他纯 Java SDK 中的这个 Kotlin 文件不会对不使用 Kotlin 的客户产生负面影响吗?可以用Java表达吗?
或者我应该简单地将MyDevice.java转换为 Kotlin?对于仍在使用 Java 的客户,这样的步骤会有什么负面影响?
java - 从 java 中删除冗余 SAM 构造函数时,Kotlin 丢失了可空性信息
我在我的一个项目中使用 SendBird。其中一个函数用于连接sdk:
Kotlin 提示我可以将其转换为 lambda:
问题是 lambda 内部user
是类型User!
,而真正的类型User?
有时会导致崩溃。
@Nullable
SendBird android sdk 是用 java 编写的,没有任何东西用/正确注释@NonNull
。在保持可为空类型的同时使用 lambda 的任何方法User?
?
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,比如