Статические методы расширения в Котлине

Как вы определяете статический метод расширения в Котлин? Возможно ли это? В настоящее время у меня есть метод расширения, как показано ниже.

public fun Uber.doMagic(context: Context) { // ... } 

Вышеупомянутое расширение можно вызвать в экземпляре.

 uberInstance.doMagic(context) // Instance method 

но как сделать его статическим методом, как показано ниже.

 Uber.doMagic(context) // Static or class method 

    Для достижения Uber.doMagic(context) вы можете написать расширение для объекта-компаньона Uber (требуется объявление объекта сопутствующего объекта):

     class Uber { companion object {} } fun Uber.Companion.doMagic(context: Context) { } 

    Вот что говорится в официальной документации:

    Kotlin генерирует статические методы для функций уровня пакета. Kotlin также может генерировать статические методы для функций, определенных в именованных объектах или объектах-компаньонах, если вы аннотируете эти функции как @JvmStatic. Например:

    Статические методы Котлина

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

    Теперь foo () является статическим в Java, а bar () не является:

     C.foo(); // works fine C.bar(); // error: not a static method 

    Вы можете создать статический метод с использованием объекта Companion, например:

     class Foo { // ... companion object { public fun bar() { // do anything } } } 

    и тогда вы можете назвать это так:

     class Baz { // ... private fun callBar() { Foo.bar() } } 

    Рекомендуйте посмотреть эту ссылку. Как вы можете видеть, вы просто должны объявить метод на верхнем уровне пакета (файла):

     package strings public fun joinToString(...): String { ... } 

    Это равно

     package strings; public class JoinKt { public static String joinToString(...) { ... } } 

    С константами все одинаково. Это заявление

     val UNIX_LINE_SEPARATOR = "\n" 

    равно

     public static final String UNIX_LINE_SEPARATOR = "\n"; 

    Я также очень люблю иметь возможность добавлять статические методы расширения в Котлин. В качестве обходного пути сейчас я добавляю метод exntension к нескольким классам вместо того, чтобы использовать один статический метод расширения во всех них.

     class Util fun Util.isDeviceOnline(context: Context): Boolean { val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connMgr.activeNetworkInfo return networkInfo != null && networkInfo.isConnected } fun Activity.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) } fun OkHttpClient.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) }