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
相关产品推荐
相关产品推荐

