Как добавить статические методы в классы Java в Котлине?

Можно ли добавить новый статический метод к java.lang.Math класс в Kotlin? Обычно такие вещи возможны в Kotlin благодаря Kotlin Extensions.

Я уже пытался сделать следующее в файле, который я сделал называется Extensions.kt:

fun Math.Companion.clamp(value:Double,minValue:Double,maxValue:Double):Double
{
    return Math.max(Math.min(value,maxValue),minValue)
}

но Math.Companion не может быть решена...

4 ответа

Решение

Начиная с Kotlin 1.2 это невозможно. Тем не менее, он рассматривается для будущего выпуска!

Чтобы помочь реализовать эту функцию, проголосуйте по этому вопросу: https://youtrack.jetbrains.com/issue/KT-11968

Эта идея очень популярна в сообществе Kotlin, поэтому я уверен, что она скоро появится.

Я думаю, что это невозможно. Документация гласит следующее:

Если в классе определен сопутствующий объект, вы также можете определить функции и свойства расширения для сопутствующего объекта.

Math класс Java класс, а не Kotlin один и не имеет companion объект в этом. Вы можете добавить clamp метод к Double класс вместо.

Начиная с Kotlin 1.2 это все еще невозможно.

В качестве обходного пути для статического "расширения" класса Environment, который я сейчас использую:

Class EnvironmentExtensions {
    companion object {
        @JvmStatic
        fun getSomething(): File {
            ...
            return Environment.something()
        }
    }
}

Это не идеальное решение, но дополнение кода IntelliJ/Android Studio помогает с использованием:

val something = EnvironmentExtensions.getSomething()

Обновление поверх других ответов: статические расширения будут доступны сразу после версии 2.0.

Официальное объявление: kotlin conf 2023

Другие вопросы по тегам