Вы помещаете функцию в «объект-компаньон».
Таким образом, java-код выглядит следующим образом:
class Foo {
public static int a() { return 1; }
}
станет
class Foo {
companion object {
fun a() : Int = 1
}
}
Затем вы можете использовать его из кода Котлина как
Foo.a();
. Но из кода Java вам нужно будет называть его как
Foo.Companion.a();
(который также работает из Kotlin .)
Если вам не нравится указывать бит Companion
, вы можете либо добавить аннотацию @JvmStatic
, либо назвать свой сопутствующий класс.
Из docs :
Объекты Companion
Объявление объекта внутри класса может быть помечено ключевым словом companion:
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }
Участники из сопутствующего объекта можно вызвать, просто используя имя класса в качестве определителя:
val instance = MyClass.create()
...
Однако на JVM вы можете создавать члены сопутствующих объектов как реальные статические методы и поля, если вы используете аннотацию
@JvmStatic
. Подробнее см. Раздел «Интерфейс взаимодействия с Java».Добавление аннотации
@JvmStatic
выглядит так:class Foo { companion object { @JvmStatic fun a() : Int = 1; } }
, а затем оно будет существовать как реальная статическая функция Java , доступный как из Java, так и из Kotlin как
Foo.a()
.Если это просто не нравится для имени
Companion
, вы также можете указать явное имя для объекта-компаньона:class Foo { companion object Blah { fun a() : Int = 1; } }
, который позволит вам позвонить это от Котлина таким же образом, но от java как
Foo.Blah.a()
(который также будет работать в Котлине).