java - 如何在 Kotlin 中实现这个 Java 接口(interface)?

标签 java kotlin kotlin-interop

既然 Kotlin 没有原语,那么如何实现这个接口(interface)呢?

public interface A {
  @NotNull Object get(@NotNull Integer i);
  @NotNull Object get(int i);
}

我无法更改 Java 代码,因为它是二进制库中的已编译类文件。

最佳答案

如果是单个实现,如 @zsmb13的答案,对你来说还不够,你需要在 Kotlin 中为这两个方法单独实现,然后你可以添加一个中间接口(interface),用一个可以为空的参数覆盖接受 Integer 的方法:

private interface IntermediateA : A {
    override fun get(i: Int?): Any
}

实现这个接口(interface)而不是原来的A,Kotlin编译器会区分这两种方法,允许你重写它们如下:

class C : IntermediateA {
    override fun get(i: Int) = "primitive"
    override fun get(i: Int?) = "boxed"
}

val a: A = C()
println(a.get(1)) // primitive
println(a.get(1 as Int?)) // boxed

如果您可以访问 Java 代码,则可以通过向接受装箱类型的方法添加可空性注释来解决此问题:

Object get(@Nullable Integer i);

Kotlin 编译器理解不同类型的可空性注解,here's the list .

关于java - 如何在 Kotlin 中实现这个 Java 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44132574/

相关文章:

java - 找出 Eclipse 项目中引用的 jar 的所有冲突包/类

kotlin - 平台声明与 Comparable 冲突

java - freemarker 中的子字符串不起作用

java - 混合 Kotlin 和 Java 代码

android - 如何在 Jetpack Compose 中将图像 URL 设置为线圈上的错误占位符

Android 是否可以有多个 nav_graph 文件?

kotlin - 谁能在这里详细解释 Kotlin/Native spinner 应用程序项目结构?还有关于不同模块如何工作的细节

java - 为什么在 Java 中实现返回 Unit 的 Kotlin 函数时必须返回 Unit.INSTANCE?

java - 如何在一个应用程序中创建 2 个操作栏?

java - MySQL/Hibernate SQLQuery 如何将 unsigned int(10) 转换为smallint?