在kotlin中为Math类添加扩展函数

时间:2017-08-17 20:03:27

标签: java kotlin extension-methods

我在Kotlin中向Math类添加了一个函数,但我无法使用它,我之前使用MutableList执行了此操作并且它有效但我无法使用Math

fun Math.divideWithSubtract(num1: Int, num2: Int) = 
Math.exp(Math.log(num1.toDouble())) - Math.exp(Math.log(num2.toDouble()))

3 个答案:

答案 0 :(得分:7)

您不能在静态级别上对Math使用此扩展,因为扩展仅适用于实例。 修改:由于无法实例化数学,因此您无法在其上使用扩展程序。

如果你真的想要这个方法作为扩展,你应该扩展Int:

fun Int.divideWithSubtract(otherInt: Int) = 
    Math.exp(Math.log(this.toDouble())) - Math.exp(Math.log(otherInt.toDouble()))

你会像这样使用它:

val result = 156.divideWithSubstract(15) //:Double

如果你真的想要使用static-ish方法,那么在Java和Kotlin中,你总是可以在kotlin文件中定义包级别的任何方法。

因此,doSomething(args)文件中的某些Util.kt方法可以在任何Kotlin文件中的任何位置访问,您必须在Java中调用UtilKt.doSomething()

请参阅:Package level functions in the official doc

答案 1 :(得分:4)

你不能像静态java方法一样使用它,而只能在MutableList个对象上使用它。这就是为什么它在{{1}}上工作,因为你在列表上使用它。 / p>

答案 2 :(得分:3)

为什么要在这里延长Math?当您有一个接收器类型(例如String例如),其实例要扩展时,扩展是有意义的。 Math只是一个util类而无法实例化,即它无法为函数提供合适的接收器

只需在顶级创建此方法,例如:

fun divideWithSubtract(num1: Int, num2: Int) =
        Math.exp(Math.log(num1.toDouble())) - Math.exp(Math.log(num2.toDouble()))