Проблема преобразования Java в Kotlin | - или / & - и - PullRequest
1 голос
/ 17 марта 2019

У меня есть некоторые проблемы при преобразовании кода Java в Kotlin.Это пример в java:

if ((deviceFd.revents & OsConstants.POLLOUT) != 0) {
    Log.d(TAG, "Write to device");
    writeToDevice(outputStream);
}

Если мы конвертируем этот код в Kotlin через Android Studio, он производит что-то вроде этого

if (deviceFd.revents and OsConstants.POLLOUT != 0) {
    Log.d(TAG, "Write to device")
    writeToDevice(outputStream)
}

Но этот код не может быть скомпилирован из-за ошибки:

operator != cannot be applied to 'Short' and 'Int'

Итак, что эквивалентно коду Java для Kotlin?

1 Ответ

3 голосов
/ 18 марта 2019

В Java символ & является побитовым оператором AND.

x & y

Если два операнда (в данном случае x и y)) имеет разные типы.Значение малого типа неявно повышается до большего типа.

байт, короткий, символ => int => long

  • long & long => long
  • int & int => int
  • int & long => long & long => long
  • (byte|char|short) & int => int & int => int
  • (byte|char|short) & long => int & long => long & long => long

В вашем случае

deviceFd.revents (short) & OsConstants.POLLOUT (int)

будет повышен

deviceFd.revents (int) & OsConstants.POLLOUT (int)

Результат int type.


В Kotlin сделать то же самое, что и в Java.

Шаг 1. Потому что Kotlin НЕ продвигает меньший тип к большему типу неявно, поэтому вы (как программист) должны сделать это явно.

deviceFd.revents (short) => deviceFd.revents.toInt() (int)

Шаг 2. В Котлине нет символа & , поэтому вынеобходимо использовать и для выполнения побитовой операции И между двумя значениями.

deviceFd.revents.toInt() and OsConstants.POLLOUT

Сложить вместе.

if ((deviceFd.revents.toInt() and OsConstants.POLLOUT) != 0) {
    Log.d(TAG, "Write to device")
    writeToDevice(outputStream)
}

Обновление: На основании комментария автора

deviceFd.events |= (short) OsConstants.POLLOUT;

Java

deviceFd.events (short) | OsConstants.POLLOUT (int)
deviceFd.events (int) | OsConstants.POLLOUT (int)
deviceFd.events = (short)(deviceFd.events (int) | OsConstants.POLLOUT (int))

Эквивалент Kotlin

deviceFd.events = (deviceFd.events.toInt() or OsConstants.POLLOUT).toShort()

Kotlin

deviceFd.events = deviceFd.events or OsConstants.POLLOUT.toShort()

Побитовые операциинаходится в экспериментальном состоянии, есть ли лучшее решение?

Это единственный и официальный способиспользовать побитовые операции в Kotlin.Кроме того, при компиляции в байт-код Java они все еще используют побитовые операции Java (| &) под капотом.

Кстати, побитовые операции находятся в экспериментальном состоянии, но когда эта функция будет завершена, они будутперейти в рабочее состояние, не нарушая текущий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...