gpt4 book ai didi

Java 到 Kotlin 的转换问题 | - 或/& - 和

转载 作者:行者123 更新时间:2023-11-29 04:10:55 24 4
gpt4 key购买 nike

我在将 Java 代码转换为 Kotlin 时遇到了一些问题。这是 java 中的示例:

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

如果我们通过 Android Studio 将这段代码转换为 Kotlin,它会产生类似这样的东西

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

但是这段代码因为错误无法编译:

operator != 不能应用于 'Short' 和 'Int'

那么 Java 代码与 Kotlin 的等价物是什么?

最佳答案

在 Java 中,& 符号是按位与运算符。

x & y

如果两个操作数(在本例中为 x 和 y)具有不同的类型,较小类型的值将隐式提升为较大类型。

byte, short, char => 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 类型。


在 Kotlin 中,这是与 Java 中相同的方法。

第 1 步。因为 Kotlin 不会隐式地将较小的类型提升为较大的类型,您(作为程序员)必须显式地进行。

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

第二步,Kotlin中没有&符号,所以必须使用and在两个值之间执行按位与运算。

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()

Bitwise Operations is in experimental state, is there any bettersolution?

这是在 Kotlin 中使用按位运算的唯一官方方式。此外,当编译为 Java 字节码时,它们仍然在底层使用 Java 位运算 (| &)。

顺便说一下,Bitwise Operations 处于实验状态,但是当这个特性最终确定时,它们将被移动在不破坏当前代码的情况下进入生产状态。

关于Java 到 Kotlin 的转换问题 | - 或/& - 和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com