Android经典实战之用Kotlin泛型实现键值对缓存

简介: 本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Kotlin 中的泛型是一种允许类型参数化的特性。它可以增强代码的重用性、类型安全性和可读性。在实际编写代码时,通过泛型,你可以编写更为通用的类和方法,而不必具体针对某种特定类型。

基本语法

在 Kotlin 中,使用尖括号 <> 来定义泛型。例如,泛型类的定义如下:

class Box<T>(t: T) {
    var value = t
}

这里,T 是一个类型参数,可以在类的任何成员中使用。你可以像这样创建 Box 对象:

val intBox = Box<Int>(10)
val stringBox = Box<String>("Hello")

泛型函数

同样,你也可以定义泛型函数:

fun <T> singletonList(item: T): List<T> {
    return listOf(item)
}

调用泛型函数:

val list = singletonList(1) // 返回 List<Int>

泛型约束

有时你可能希望类型参数满足某些条件,比如必须是某个类的子类或实现了某个接口。这可以通过泛型约束实现:

fun <T : Comparable<T>> sort(list: List<T>) {
    // sort implementation
}

在这个例子中,类型参数 T 被约束为 Comparable 的子类型。

型变(Variance)

Kotlin 中的型变分为协变(Covariance)和逆变(Contravariance)。协变允许子类型替换父类型,而逆变则相反。

协变

协变使用 out 关键字修饰类型参数。这意味着类型参数只能出现在输出位置:

class Producer<out T>(private val value: T) {
    fun produce(): T {
        return value
    }
}

val producer: Producer<Number> = Producer<Int>(10) // 合法

逆变

逆变使用 in 关键字修饰类型参数。这意味着类型参数只能出现在输入位置:

class Consumer<in T> {
    fun consume(item: T) {
        // Consume the item
    }
}

val consumer: Consumer<Number> = Consumer<Any>() // 合法

泛型实战

以下是一个实际示例,展示如何在 Kotlin 中使用泛型构建一个通用的数据缓存系统:

class Cache<K, V> {
    private val map = mutableMapOf<K, V>()

    fun put(key: K, value: V) {
        map[key] = value
    }

    fun get(key: K): V? {
        return map[key]
    }

    fun remove(key: K): V? {
        return map.remove(key)
    }

    fun clear() {
        map.clear()
    }
}

// 使用这个缓存类
fun main() {
    val cache = Cache<String, Int>()
    cache.put("key1", 1)
    cache.put("key2", 2)

    println(cache.get("key1")) // 输出 1
    println(cache.get("key2")) // 输出 2

    cache.remove("key1")
    println(cache.get("key1")) // 输出 null

    cache.clear()
    println(cache.get("key2")) // 输出 null
}

通过这个 Cache 类,你可以缓存任意类型的键值对,比如 String 对应 Int,或者其他任意类型的组合:

val stringCache = Cache<String, String>()
val intCache = Cache<Int, Double>()

总之,泛型是 Kotlin 中非常强大且灵活的特性,可以使你的代码更具复用性和类型安全性。通过以上的基础知识和实战示例,你可以更好地理解和应用泛型。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
927 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
763 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
963 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
220 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
6月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
481 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
5月前
|
缓存 并行计算 监控
vLLM 性能优化实战:批处理、量化与缓存配置方案
本文深入解析vLLM高性能部署实践,揭秘如何通过continuous batching、PagedAttention与前缀缓存提升吞吐;详解批处理、量化、并发参数调优,助力实现高TPS与低延迟平衡,真正发挥vLLM生产级潜力。
1260 0
vLLM 性能优化实战:批处理、量化与缓存配置方案
|
6月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
443 4
|
6月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
177 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
6月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
308 1
Redis专题-实战篇二-商户查询缓存
|
5月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
285 0

热门文章

最新文章