【教程】Kotlin语言学习笔记(六)——泛型
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!
【Kotlin语言学习】系列文章
第一章 《认识Kotlin》
第二章 《数据类型》
第三章 《数据容器》
第四章 《方法》
第五章 《Lambda表达式与条件控制》
第六章 《泛型》
文章目录
- 【Kotlin语言学习】系列文章
- 一、泛型接口
- 二、泛型方法
- 三、泛型约束
在 Kotlin 中,泛型(Generics) 是一种参数化类型的概念,它允许在定义类、接口和函数时使用类型参数,以在使用时指定具体的类型。泛型的引入使得代码更具灵活性和重用性,同时提高了类型安全性。
一、泛型接口
泛型接口 的含义是指在定义接口时使用泛型类型参数,使得接口中的方法或属性可以适用于多种类型。通过泛型接口,可以在接口中定义通用的方法或属性,而具体的实现类可以根据需要指定具体的类型,从而实现灵活性和通用性的代码设计。
以下是定义泛型接口的示例,展示了如何定义和使用泛型接口。
// 定义一个泛型接口
interface Color<T> {fun getValue(): Tfun setValue(value: T)
}// 实现泛型接口
class Red : Color<String> {private var value: String = ""override fun getValue(): String {return value}override fun setValue(value: String) {this.value = value}
}fun main() {val redColor = Red()redColor.setValue("Color is red!")println(redColor.getValue()) // 输出:Color is red!
}
在上面的示例中定义了一个泛型接口 Color<T>
,它包含了一个泛型类型参数 T
,其中定义了两个方法:
getValue()
方法用于获取该类型的值,返回的类型就是泛型接口设置的泛型类型。setValue()
方法用于设置该类型的值,形参的值类型也是泛型接口设置的泛型类型。
接着,通过该接口定义了一个具体类 Red
,并指定了泛型类型为String
字符串类型。首先定义一个私有变量value
为字符串,然后设置 getValue()
的返回值为作为字符串的value
,向 setValue()
传入了value
的值,从而实现了 Color<String>
接口。通过实现接口中的方法 getValue()
和 setValue()
,我们可以对泛型类型为 String
的值进行操作。
在 main
函数中,我们通过Red
类创建了一个对象作为redColor
变量,将字符串“Color is red!”
设置到对象中,并通过 getValue()
方法获取该值并输出。
二、泛型方法
泛型方法 是一种可以在不同类型之间共享代码逻辑的方法,而无需针对每种类型编写不同的方法。它们可以在函数或者方法中使用泛型类型参数,从而使得这些函数或方法可以接受不同类型的参数,并且在编译时会进行类型检查保证类型安全性。以下是一个简单的示例。
// 定义一个泛型函数
fun <T> printItem(item: T) {println(item)
}fun main() {// 使用泛型函数打印不同类型的数据printItem(5) // 输出:5printItem("Hello") // 输出:HelloprintItem(3.14) // 输出:3.14
}
这里直接对函数定义泛型,使得方法可以不受到数据类型限制而使用。
三、泛型约束
泛型约束 是一种在泛型编程中限制泛型类型参数的能力的机制。通过泛型约束,我们可以指定泛型类型参数必须满足的条件,以确保在泛型代码中使用这些类型参数时的安全性和有效性。
在 Kotlin 中,泛型约束使用 :
符号来指定。如果你需要对同一个类型参数施加多个约束,可以使用 where
关键字。
以下是简单的示例。
// 定义一个泛型函数,该函数接受一个泛型类型参数 T,该参数必须是 Number 或者其子类型,并且实现了 Comparable 接口
fun <T : Number> test(value: T) where T : Comparable<T> {println("Performing operation with $value")
}fun main() {test(5) // 合法,因为 Int 是 Number 的子类型,并且实现了 Comparable 接口// performOperation("Hello") // 编译错误,因为 String 不是 Number 的子类型
}
在以上的代码中,定义了一个名为test
的函数,使用泛型并指定必须是数字型,使用comparable接口——这里的comparable接口定义了一个对象如何进行比较的标准,允许对象之间进行自然排序。
我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!
相关文章:

【教程】Kotlin语言学习笔记(六)——泛型
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…...

【中文视觉语言模型+本地部署 】23.08 阿里Qwen-VL:能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存+)
项目主页:https://github.com/QwenLM/Qwen-VL 通义前问网页在线使用——(文本问答,图片理解,文档解析):https://tongyi.aliyun.com/qianwen/ 论文v3. : 一个全能的视觉语言模型 23.10 Qwen-VL: A Versatile…...

【Qt 学习笔记】Qt 背景介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 背景介绍 文章编号:Qt 学习笔记 / 01 文章目录 Qt 背景…...
C++递推算法
数塔问题 #include<bits/stdc.h> using namespace std; void f(int,int,int); int a[100][100]; int n; int main() {cin>>n;for(int i0;i<n;i){for(int j0;j<1i;j){cin>>a[i][j];}}for(int in-2;i>0;i--){for(int j0;j<i1;j){a[i][j]a[i][j]ma…...

Go项目结构整洁实现|GitHub 3.5k
一、前言 hi,大家好,这里是白泽。今天给大家分享一个GitHub 🌟 3.5k 的 Go项目:go-backend-clean-arch https://github.com/amitshekhariitbhu/go-backend-clean-architecture 这个项目是一位老外写的,通过一个 HTT…...
Python读取PDF文字 去掉页眉页脚
使用PyMuPDF(即fitz)读取PDF中的text时,会把页码也读进来。所以,有时候就需要让程序忽略页眉和页脚,或者直接删除页眉和页脚。 根据fitz的文档:Page - PyMuPDF 1.24.0 documentation get_text的clip参数可…...

Linux:入门篇
文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么?4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手,不知道从何开始学习,相信这篇文章将会为你提供一个清晰的思路。…...

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)
真亦假,假亦真 简介:java伪造php一句话马。实则信息泄露一扫就出,flag在/flag里面。 题目描述:开开心心签个到吧,祝各位师傅们好运~ 静态flag:NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…...
处理关于 React lazy 白屏的两种方案
这篇文章是今天在阅读 React 官方文档的时候看到的一个关于 处理 lazy 体验问题的小技巧,在这里记录一下 当我们使用 React.lazy 去懒加载一个路由组件,在不做任何其他处理的情况下从其他页面首次进入到这个懒加载的路由页面时,肯定会出现白屏…...

Nginx 基础
文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…...

C++完美转发(适合小白)
我们知道,C中有左值引用和右值引用,首先我们要知道什么是左值什么是右值。 左值:表达式结束后依然存在的持久对象。左值可以出现在赋值语句的左边或右边。例如,变量和函数返回的引用都是左值。左值通常有持久的地址,可…...
如何创建自己的 Spring Boot Starter 并为其编写单元测试
当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。 快速入门 创建一个新的 Maven 项目。第三方封装的…...

C++ :STL中deque的原理
deque的结构类似于哈希表,使用一个指针数组存储固定大小的数组首地址,当数据分布不均匀时将指针数组内的数据进行偏移,桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来,从原理可以看出deque的性能是非常高的…...

AttributeError: ‘Namespace‘ object has no attribute ‘EarlyStopping‘
报错原因 这个报错信息表明在Python脚本train.py中尝试访问命令行参数args.EarlyStopping时出错,具体错误是AttributeError: Namespace对象没有名为EarlyStopping的属性。 在Python的argparse模块中,当我们通过命令行传递参数并解析时,解析…...

深度学习pytorch——卷积神经网络(持续更新)
计算机如何解析图片? 在计算机的眼中,一张灰度图片,就是许多个数字组成的二维矩阵,每个数字就是此点的像素值(图-1)。在存储时,像素值通常位于[0, 255]区间,在深度学习中࿰…...

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】
edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站,但chrome浏览器可以登录浏览器插件无法使用,比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站,但chro…...

OpenHarmony无人机MAVSDK开源库适配方案分享
MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK,支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议,用于与无人机(以及机载无…...

模型训练----parser.add_argument添加配置参数
现在需要配置参数来达到修改训练的方式,我现在需要新建一个参数来开关wandb的使用。 首先就是在def parse_option():函数里添加上你要使用的变量名 parser.add_argument("--open_wandb",type bool,defaultFalse,helpopen wandb) 到config文件里增加你的…...

数字未来:探索 Web3 的革命性潜力
在当今数字化的时代,Web3作为互联网的新兴范式正逐渐崭露头角,引发了广泛的关注和探讨。本文将深入探索数字未来中Web3所蕴含的革命性潜力,探讨其对社会、经济和技术的深远影响。 1. Web3:数字世界的下一个阶段 Web3是一个正在崛…...

群晖NAS使用Docker部署大语言模型Llama 2结合内网穿透实现公网访问本地GPT聊天服务
文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛,包括聊天机…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...