Добавить функцию расширений в класс Math в kotlin

Я добавил функцию в класс Math в Kotlin, но я не мог ее использовать, я сделал это раньше с MutableList и это сработало, но я не могу сделать это с помощью класса Math .

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

Вы не можете использовать это расширение на Math на статическом уровне, потому что расширения работают только с экземплярами. edit : Поскольку 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, и вам нужно будет вызвать UtilKt.doSomething() в Java.

см.: Функции уровня пакета в официальном документе

Вы не можете использовать его как статические java-методы, но только на объектах Math . Именно поэтому он работал над MutableList потому что вы использовали его в списке .

Почему вы хотите расширить Math здесь? Расширение имеет смысл, когда у вас есть тип приемника (например, String ), экземпляры которого вы хотите расширить. Math – это просто класс утилиты и не может быть создан , т. Е. Невозможно предоставить соответствующий приемник функции.

Просто создайте этот метод на верхнем уровне, например:

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