Java подпись для Kotlin функций с одним выражением - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть несколько Kotlin методов, которые я хочу вызвать из JNI.

С моей текущей реализацией у меня есть следующий источник на Kotlin стороне.

    var eventLayer: EventInterface? = null

    private fun onDisconnection(start: Boolean)  {
        eventLayer?.onDisconnection(start)
    }

Метод подпись "onDisconnection (Z) V", и все работает нормально.

Для такого простого метода я думал об использовании функции с одним выражением. Что-то вроде.

    var eventLayer: EventInterface? = null

    private fun onDisconnection(start: Boolean) = eventLayer?.onDisconnection(start)

При запуске моего приложения у меня возникло исключение NoSuchMethod (не очень ожидаемое!), И я проверил сигнатуру метода, которая изменилась на "onDisconnection (Z) Ljava / lang / Void;"

Кто-нибудь объяснит мне эту небольшую разницу? И есть ли способ получить такую ​​же подпись "(Z) V" с помощью функции с одним выражением?

Спасибо!

VR

1 Ответ

2 голосов
/ 23 апреля 2020

Тип возврата

private fun onDisconnection(start: Boolean) = eventLayer?.onDisconnection(start)

- это то, что eventLayer?.onDisconnection возвращает. Это, по крайней мере, включает null, потому что это то, что возвращается, когда eventLayer равно нулю.

Если вы заботитесь о типе возврата этой функции, то вам, вероятно, следует объявить ее. Тогда вы получите ошибку компилятора, потому что null не является Unit.

Я уверен, что вы можете исправить это так:

private fun onDisconnection(start: Boolean) : Unit = 
    eventLayer?.onDisconnection(start) ?: Unit

... но это довольно странно использовать = с выражением, которое не производит никакого значения. Вы, вероятно, должны просто написать это в фигурных скобках.

...