提问人:kwas 提问时间:10/22/2023 最后编辑:kwas 更新时间:10/23/2023 访问量:48
Kotlin 扩展不适用于 java.util.UUID
Kotlin extensions does not work with java.util.UUID
问:
我尝试在 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)
}
编辑: 我看到这是不可能的,要添加静态扩展,我必须做如下事情:
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)
答:
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)
评论