Доступ к функции расширения Kotlin из Java

#kotlin

#kotlin

Вопрос:

Можно ли получить доступ к функциям расширения из кода Java?

Я определил функцию расширения в файле Kotlin.

 package com.test.extensions

import com.test.model.MyModel

/**
 *
 */
public fun MyModel.bar(): Int {
    return this.name.length()
}
 

Где MyModel — это (сгенерированный) класс Java. Теперь я хотел получить к ней доступ в моем обычном Java-коде:

 MyModel model = new MyModel();
model.bar();
 

Однако это не работает. Среда IDE не распознает метод bar(), и компиляция завершается с ошибкой.

Что действительно работает, так это использование статической функции из kotlin:

 public fun bar(): Int {
   return 2*2
}
 

с помощью импорта com.test.extensions.ExtensionsPackage итак, моя IDE, похоже, настроена правильно.

Я просмотрел весь файл Java-interop из документов kotlin, а также много гуглил, но не смог его найти.

Что я делаю не так? Возможно ли это вообще?

Ответ №1:

Возможно, так:

 // CallExtensionFunction.java
package com.example.groundup;

public class CallExtensionFunction {

    public static void main(String[] args) {

        MyModel myModel = new MyModel();

        int bar = MyModelKt.bar(myModel);

        System.out.println(bar);
    }
}


// MyModell.kt
package com.example.groundup

fun MyModel.bar(): Int {
    return this.name.length
}

class MyModel() {
   val name = "Hugo"
}
 

Функция расширения предоставляется в соответствующем синглтоне с суффиксом «Kt» в качестве статического метода.