У меня смешанный проект, классы 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();