You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin扩展函数无法作用于java.util.UUID的问题及解决方法

Kotlin中为java.util.UUID实现静态风格扩展函数的正确方式

问题分析

最初尝试的扩展函数属于UUID实例的扩展方法,只能在UUID对象实例上调用,无法通过UUID.fromDatabase()这种类级静态方式调用,因此编译器无法识别:

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

改用KClass<UUID>的扩展虽然能运行,但调用方式不够直观,不符合常规静态方法的使用习惯:

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

// 可用但不优雅的实现
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)

正确实现方案

Kotlin支持为Java类的伴生对象编写扩展函数,以此模拟静态方法的调用方式,这是最符合直觉的实现:

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

// 为UUID的伴生对象编写扩展函数,实现类级别的调用
fun UUID.Companion.fromDatabase(byteArray: ByteArray): UUID {
    val bb = ByteBuffer.wrap(byteArray)
    val high = bb.getLong()
    val low = bb.getLong()
    return UUID(high, low)
}

调用方式

直接通过UUID类名调用,和Java静态方法的使用方式完全一致:

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

内容的提问来源于stack exchange,提问作者kwas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:11