Kotlin 扩展不适用于 java.util.UUID

Kotlin extensions does not work with java.util.UUID

提问人:kwas 提问时间:10/22/2023 最后编辑:kwas 更新时间:10/23/2023 访问量:48

问:

我尝试在 Kotlin 中创建扩展函数,但是,编译器看不到它,它不起作用,无论我是否手动导入它,其他扩展在我的代码中都运行良好。 如果我把这个扩展放在我想使用它的类中,它的事件不起作用。

import java.nio.ByteBuffer
import java.util.*

fun UUID.fromDatabase(byteArray: ByteArray): UUID {
    val bb: ByteBuffer = ByteBuffer.wrap(byteArray)
    val high: Long = bb.getLong()
    val low: Long = bb.getLong()

    return UUID(high, low)
}

enter image description here

编辑: 我看到这是不可能的,要添加静态扩展,我必须做如下事情:

fun KClass<UUID>.fromDatabase(byteArray: ByteArray): UUID {
    val bb: ByteBuffer = ByteBuffer.wrap(byteArray)
    val high: Long = bb.getLong()
    val low: Long = bb.getLong()

    return UUID(high, low)
}

和用法

val id = UUID::class.fromDatabase(element["id"] as ByteArray)
Java 函数 kotlin uuid

评论

0赞 kwas 10/22/2023
github.com/Kotlin/KEEP/issues/348

答:

2赞 Vlad Guriev 10/22/2023 #1

您的扩展位于 UUID 实例上,这就是为什么它在作为静态方法调用时不起作用的原因(但例如,可以工作)UUID.randomUUID().fromDatabase(...)

如果 UUID 类是用 Kotlin 编写的,并且有公共伴随对象,你就可以做到这一点,这样你的扩展函数就会打开,但在这种情况下,这是不可能的。UUID.Companion

评论

1赞 kwas 10/22/2023
是的,我已经发现(在编辑部分),也许它将来会是一个选项:github.com/Kotlin/KEEP/issues/348
1赞 marcinj 10/23/2023 #2

您正在尝试在类 UUID 上创建一个扩展函数,但将其用作静态方法。Kotlin 中的扩展函数不是静态方法,而是实例方法。因此,您不能在类本身上调用它们,您只能在类的实例上调用它们。

在您的例子中,您可以创建一个顶级函数,而不是一个扩展函数。这是你如何做到的:

import java.nio.ByteBuffer
import java.util.*

fun fromDatabase(byteArray: ByteArray): UUID {
    val bb: ByteBuffer = ByteBuffer.wrap(byteArray)
    val high: Long = bb.getLong()
    val low: Long = bb.getLong()

    return UUID(high, low)
}

你可以这样使用它:

val id = fromDatabase(element["id"] as ByteArray)