java - 如何从 Java 中引用伴随对象?

标签 java interop kotlin companion-object

我有一个混合项目,JavaKotlin类,我想知道如何引用 companion objects来 self 的Java类。

最佳答案

Kotlin 中的伴生对象具有静态支持字段和方法,以便与 Java 互操作,因此如果您正确注释它们(使用 @JvmStatic 和 @JvmField),您基本上可以将它们视为静态类。所以:

class C {
    companion object {
        @JvmStatic fun foo() {}
        fun bar() {}
    }
}

foo 可以像静态函数一样从 Java 访问。酒吧不能。

C.foo(); // works fine
C.bar(); // error: not a static method
C.Companion.foo(); // instance method remains
C.Companion.bar(); // the only way it works

你可以对字段做同样的事情,除了你使用 JvmField

class Key(val value: Int) {
    companion object {
        @JvmField val COMPARATOR: Comparator<Key> = compareBy<Key> { it.value }
    }
}

然后:

// Java
Key.COMPARATOR.compare(key1, key2);
// public static final field in Key class

你也可以使用 const。

// file: Example.kt

object Obj {
    const val CONST = 1
}

class C {
    companion object {
        const val VERSION = 9
    }
}

const val MAX = 239

在 Java 中:

int c = Obj.CONST;
int d = ExampleKt.MAX;
int v = C.VERSION;

有关详细信息,请参阅 Java to Kotlin interop in the documentation (无论如何,示例都是从那里复制粘贴的)。

如果您想经常与 Java 进行互操作,我建议您了解(并使用)JvmStatic 和 JvmField 注解,因为它们对于平滑 Kotlin 与 Java 的交互非常重要。

关于java - 如何从 Java 中引用伴随对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44189129/

相关文章:

java - JPA 在持久化实体时跳过持久化特定属性

c# - 在 C# 中打印 pcl 文件不起作用,建议?

非直觉类型推断的 Kotlin 案例

android - 上传图像,Firebase 显示 "User does not have permission to access this object",即使存储设置是公开的

kotlin - 在 Kotlin/JVM 中加载 Kotlin/Native 共享库

kotlin - kotlin文档中的 'Common', 'JVM', 'JS'和 'JVM'标签指示什么?

Java 代码在 AWS 上耗尽了空间内存,但在 MacOSX 上没有

java - Android 如何追加 SQLite 数据库

java - ASM(Java的字节码工具)中的Frame如何使用? visitFrame/FrameNode的各个参数是什么意思?

java - 从 Java 调用 powershell