【问题标题】:How can one add static methods to Java classes in Kotlin如何在 Kotlin 中向 Java 类添加静态方法
【发布时间】:2016-02-27 22:40:39
【问题描述】:

是否可以在Kotlin 中的java.lang.Math 类中添加新的静态方法?通常,感谢Kotlin Extensions,这些事情在 Kotlin 中是可能的。

我已经尝试在我创建的名为 Extensions.kt 的文件中执行以下操作:

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

Math.Companion 无法解析...

【问题讨论】:

  • 为什么不把函数加到Double类中呢? fun Double.clamp(min: Double, max Double),被称为1.0.clamp(2.0, 3.0)
  • 我认为这将在未来的版本中成为可能
  • 不强制输入 (kotlinlang.org/api/latest/jvm/stdlib/kotlin/coerce-in.html) 您需要什么?
  • 是的!谢谢@SergeyMashkov,这就是我在这种情况下所需要的。但是,我应该将我的问题重新表述为:“如何在 Kotlin 中向 Java 类添加静态方法”
  • @Eric 那么你唯一能做的就是声明顶级函数(不是扩展)并将其放入特定的包中

标签: kotlin kotlin-extension


【解决方案1】:

我认为这是不可能的。 Documentation says以下:

如果一个类定义了伴生对象,您还可以为伴生对象定义扩展函数和属性。

Math 类是 Java 类,而不是 Kotlin 类,并且其中没有 companion 对象。您可以将clamp 方法添加到Double 类。

【讨论】:

    【解决方案2】:

    从 Kotlin 1.3 开始,这是不可能的。但是,它正在考虑在未来的版本中发布!

    为帮助实现此功能,请对此问题进行投票:https://youtrack.jetbrains.com/issue/KT-11968

    这个想法在 Kotlin 社区中非常流行,所以我敢打赌它很快就会出现。

    【讨论】:

    • 对于此答案中的任何人,请投票给 jetbrains 帖子,以便我们可以更早地拥有该功能!
    【解决方案3】:

    从 Kotlin 1.2 开始,这仍然是不可能的。

    作为一种解决方法,静态“扩展”我当前使用的环境类:

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

    这不是一个理想的解决方案,但 IntelliJ/Android Studio 代码完成有助于使用:

    val something = EnvironmentExtensions.getSomething()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2019-08-15
      相关资源
      最近更新 更多