Как я могу ссылаться на сопутствующие объекты из Java?

У меня смешанный проект, классы Java и Kotlin , и я хочу знать, как я могу ссылаться на companion objects из своих классов Java .

Сопутствующий объект в Котлине имеет статические поля и методы поддержки для взаимодействия с 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» в документации (все экземпляры в любом случае скопированы).

Я рекомендую хорошо знать (и использовать) аннотации JvmStatic и JvmField, если вы хотите часто взаимодействовать с Java, поскольку они действительно важны для сглаживания взаимодействия Kotlin с Java.

Хорошо! Если у вас есть что-то вроде:

 class MyKotlinClass { companion object { val VAR_ONE = 1 val VAR_TWO = 2 val VAR_THREE = 3 fun printOne() { println(VAR_ONE) } } } 

таким образом вы можете получить доступ к полям из вашего Java-класса

 public class MyJavaClass { private void myMethod(){ MyKotlinClass.Companion.getVAR_ONE(); //The same for methods MyKotlinClass.Companion.printOne(); } } 

Это класс Kotlin с сопутствующим объектом.

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

Вызов класса компаньона Kotlin из Java:

 A.foo(); A.Companion.foo(); A.Companion.bar();