《Kotlin入门实战》CH8 | 泛型

Kotlin协程高并发服务器:四种核心模式与性能优化实战 并发编程是现代服务端开发的核心技术,通过合理利用计算资源提升系统吞吐量。Kotlin协程基于挂起函数和状态机机制,在用户态实现轻量级线程切换,避免了传统线程模型的内存开销和上下文切换成本。这种非阻塞并发模型特别适合I/O密集型场景,能够显著提升资源利用率和系统性能。在实际工程实践中,开发者需要掌握每请求一协程、生产者-消费者等核心模式,并注意调度器选择和资源管理。针对高并发服务器场景,Kotlin协程提供了结构化并发和背压处理等机制,帮助构建稳定高效的服务端应用,解决传统多线程模型在应对高并发请求时的性能瓶 阅读详情

泛型

泛型是在Java5中引入的,泛型让集合框架可以重用代码,在没有泛型时候,集合框架中存储数据的类型都是Object,也就是说存入和取出数据都需要对对象进行强制类型转换。这就很可能出现错误。

1 类接口函数上使用泛型

泛型接口

interface Send<T>{
    fun handleMessage(t : T) : T;
}

fun main() {
    val h = object : Send<String>{
        override fun handleMessage(t: String): String {
            println(t)
            return "收到消息$t"
        }
    }
    println(h.handleMessage("hello"))
}

/*
hello
收到消息hello
*/

泛型类

class TClass<T>(var t : T){
    override fun toString(): String {
        return t.toString()
    }
}

fun main() {
    val t = TClass<Int>(1)
    println(t)
}

泛型函数

fun <T> handleT(t: T){
    println(t)
}

fun main() {   
    handleT<String>("nihao")
}

2 泛型上界

fun <T : Comparable<T>> gt(x: T, y: T): Boolean

<>中的T : Comparable<T>表示实现Comparable接口的类型

3 协变和逆变

协变

java中不支持协变,使用了通配符来解决的问题。

Number类型(简记为F)是Integer类型(简记为C)的父类型,我们把这种父子类型关系简记为C=>F(C继承F);而List,List代表的泛型类型信息分别简记为f(F),f(C)。那么我们可以这样描述协变和逆变:
当C =>F时,如果有f(C) => f(F),那么f叫做协变;
当C => F时,如果有f(F) => f(C),那么f叫做逆变。如果上面两
种关系都不成立则叫做不变。

协变和逆变都是安全的。

Java中数组是可以协变的

        Integer[] ints = new Integer[3];
        ints[0] = 0;
        ints[1] = 1;
        ints[2] = 2;
        Number[] numbers = new Number[3];
        numbers = ints; //数组是协变的,可以正确赋值
        for (Number n : numbers) {
            System.out.println(n);
        }

java中泛型是不可以协变的

public class Test {
    static class A{

    }
    static class B extends A{

    }

    public static void main(String[] args) {
        List<B> bs = new ArrayList<>();
        bs.add(new B());
        List<A> as = (List<A>) bs; // Error Java泛型是不变的
    }
}
Error:(17, 32) java: 不兼容的类型: java.util.List<Test.B>无法转换为java.util.List<Test.A>

所以下面代码也是不合法的

List<Integer> integerList = new ArrayList<>();
integerList.add(0);
integerList.add(1);
integerList.add(2);
List<Number> numberList = new ArrayList<>();
numberList = integerList; //编译错误:类型不兼容

Java中泛型和数组的不同行为的确引起了许多混乱,就算我们使用通配符这样写:

List<? extends Number> list = new ArrayList<Number>();
list.add(new Integer(1)); //error

还是报错,不是说通配符可以解决协变问题吗

这个情况需要特殊说明,如果可以向List<? extends Number>中添加Integer,Float等,则意味着,List中存取的数据可以是integer, Float, Double等等,着就导致了List存储的元素类型混乱,所以Java禁止向List<? extends Number>中添加任意Number子类型的对象。但是可以添加Null指针。

逆变

java对逆变是支持的

8923455-dad97c66c7659670.png
逆变
    List<? super Integer> list = new ArrayList<Object>();
    list.add(Integer.valueOf(1));

PECS

总结 ? extends 和 the ? super 通配符的特征,我们可以得出以下结论:

  • 如果你想从一个数据类型里获取数据,使用 ? extends 通配符
  • 如果你想把对象写入一个数据结构里,使用 ? super 通配符
  • 如果你既想存,又想取,那就别用通配符。

这就是Maurice Naftalin在他的《Java Generics and Collections》这本书中所说的存取原则,以及Joshua Bloch在他的《Effective Java》这本书中所说的PECS法则。

Bloch提醒说,这PECS是指”Producer Extends, Consumer Super”,这个更容易记忆和运用。

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
        int srcSize = src.size();
        if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");

        if (srcSize < COPY_THRESHOLD ||
            (src instanceof RandomAccess && dest instanceof RandomAccess)) {
            for (int i=0; i<srcSize; i++)
                dest.set(i, src.get(i));
        } else {
            ListIterator<? super T> di=dest.listIterator(); // 写入数据
            ListIterator<? extends T> si=src.listIterator(); // 读取数据
            for (int i=0; i<srcSize; i++) {
                di.next();
                di.set(si.next());
            }
        }
    }

在kotlin中直接使用in和out来代替super和extends

out T等价于? extends T;
in T等价于? super T。

4 类型擦除

对于JVM来说并不存在List<Integer> ,JVM中只存在List,Kotlin也是这样的。

类型擦除的基本过程也比较简单:

  1. 首先,找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话,则使用这个上界。
  2. 其次,把代码中的类型参数都替换成具体的类。同时去掉出现的类型声明,即去掉<>的内容。例如,Tget()就变成了Objectget(),List就变成了List。
  3. 最后,根据需要生成一些桥接方法。这是由于擦除了类型之后的类可能缺少某些必须的方法。这个时候就由编译器来动态生成这些方法。
【文献阅读:信道估计】Deep Residual Learning Meets OFDM Channel Estimation 基于深度学习的信道估计技术 阅读详情

相关推荐

Blender.粒子效果

Blender.粒子效果 ✦ shift+A新建一个棱角球,细分(之后要分解成许多小颗粒) ✦ 给球添加粒子系统,这时播放粒子会向下掉,力场权重☛重力☛0后,粒子会在球体周围运动 ✦ shift+A添加一个力场,调整力场强度 ✦如果粒子运动太快,我们可以在输出属性中调整时间重映射的原始值 ✦想让粒子在球周围运动而不是发散出去,在物理属性找到力场设置,调整流的大小 ✦S键将球形缩小到看不见 ✦给粒子变添加立方体的形状,在粒子属性里找到渲染选项,将“光晕”改为“物体”,在实例物体中选择新建的立方

weixin_46385629的博客 6669

Kotlin学习笔记(四)泛型

因为Kotlin本质上还是Java, 所以Kotlin的泛型和Java泛型一样都是在编译期擦除类型的。那么Kotlin的泛型做了什么优化呢? 就是针对“协变”,“逆变”,“不变”,这些型变使用做了些许简化。 先复习下Java的型变。 Java泛型的通配符 类型系统有三种基本形态,“协变”,“逆变”,“不变”。如何理解它们要从Java的类型通配符说起。 Java泛型的通配符有两种形式: ?extends T: 子类型上界限定符,指定类型参数的上限。该类型必须是T或者T的子类型。 ?super

zjuter的专栏 445

密码子偏好性分析实战指南:从codonW到EMBOSS-CUSP的完整流程解析

本文详细解析了密码子偏好性分析的完整流程,从基础概念到实战操作,涵盖codonW和EMBOSS-CUSP工具的使用技巧。通过RSCU、ENC、CAI等关键参数分析,帮助研究者理解基因表达调控规律,优化外源基因表达效率,适用于分子生物学和合成生物学研究。

weixin_33737774的博客 571

理解Java泛型通配符上下边界

<? extends T>和<? super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。 <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)” <? super T>:是指 “下界通配符(Lower Bounds Wildcards)” // 定义一个Number类型的泛型容器 List<Number> rawNumberContaine

流连是谁的博客 1216

手机也能跑大模型?QNN框架实战:从模型量化到Android部署全流程

本文详细介绍了如何利用QNN框架将大模型部署到Android手机端进行端侧推理。通过实战演示了从模型量化(如INT4/INT8混合精度)到Android应用集成的全流程,包括内存优化、性能调优及常见问题排查,帮助开发者实现大模型在资源受限设备上的高效本地运行。

joy55的博客 500

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 47

【软件构造】课件精译(五)数据类型与类型检验

前言 因为最近开始继续做项目了,课余时间比较紧张。第一篇的前言虽然说要选重要部分翻译,但事实上目前为止几乎是全部翻译,所以以后的内容可能会写的敷衍一些,排版标号也会比较简单,挑一些个人感觉有价值的东西放上来,还请见谅。 本章说明 从这一章起,课程正式以Java为编程语言讲解一切软件开发的具体事项,不再是前几章那样的软件构造理论。本章还是以Java语法为主,但是值得注意或者易混淆的地方还是很多。 本...

无极阁 442

智能车图像处理14-进阶篇6--坡道的判定

这篇文章主要讲述智能车图像处理中 : 如何判断坡道

taiyuezyh的博客 9226

Collections.copy(List<? super T> dest, List<? extends T> src) 抛出异常 Source does not fit in dest 原因剖析

Collections 工具类 集合拷贝

给自己一个前行的动力 2526

如何卸载Gazebo与重装

gazebo是一款关于车辆和无人机的仿真软件,本文大致介绍它是何物,以及他的安装和卸载方法,对于ROS开发者,本文有一定参考意义。

gongdiwudu的专栏 1万+

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 633

<? extends T> 和 <? super T>的作用

和直接有什么区别呢? 这里如果是前者那么会编译报错; 原因:前者的? 直接是在T的子类里面的具体的某一个类,但是编译器无法确定到底是哪一个子类,这样写就是为了不能add操作。 也就是说这个list是一个给予、生产的对象,只能用于获取。

atares0223的博客 5145

【系统分析师】写作框架:软件设计模式及其应用

本文围绕"软件设计模式及其应用"展开论述。首先介绍了近三年参与的某软件开发项目背景及个人承担的系统设计工作。其次系统阐述了设计模式的三大分类:创建型(如工厂方法、单例模式)、结构型(如适配器、装饰器模式)和行为型(如观察者、策略模式),重点分析了各类模式的特点和典型应用场景。最后结合项目实践,详细说明了采用的三种设计模式的具体实施过程及效果,包括提高代码复用性、降低耦合度等优势。文章还总结了项目经验,指出存在的不足及改进方向,强调合理运用设计模式对构建高质量软件系统的重要性。全文通过理论

数据知道的博客 5060

《Kotlin入门实战》CH3 | 类型系统与可空类型

类型系统与可空类型 Kotlin属于静态类型编程语言,编程语言中类型系统定义: 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何相互作用 类型系统 1. 类型系统作用 让编译器检查无意义、无效、类型不匹配的错误代码 代码更好读懂 利于抽象 char[] str = {'a','b','c'}抽象为String str = 'abc'...

落红不是无情物 159

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《Kotlin入门实战》CH7 | 集合类

集合类 在Java类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API都在kotlin.collections包下面。 集合类概述 集合层次 Iterable 可遍历...

落红不是无情物 168

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《Kotlin入门实战》CH9 | 文件IO,正则和多线程

文件IO,正则和多线程 得益于kotlin的扩展函数,kotlin对java中api进行了改进,对于java中好用的api直接使用,对于不好用的api进行了扩展和改进。 1 文件IO操作 读写 fun main() { val f = File("test.txt") // 写入文件 f.writeText("hello kotl...

落红不是无情物 278

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

8.4 Spring Boot集成Kotlin混合Java开发

8.4 Spring Boot集成Kotlin混合Java开发 本章介绍Spring Boot集成Kotlin混合Java开发一个完整的spring boot应用:Restfeel,一个企业级的Rest API接口测试平台(在开源工程restfiddle[1]基础上开发而来)。 系统技术框架 编程语言:Java,Kotlin 数据库:Mongo Sprin...

AI天才研究院 9275

Java/Kotlin TCP Socket TLS/SSL加密通讯实战指南

在网络编程中,TCP Socket是实现客户端与服务器端稳定双向通讯的基础技术。然而,明文传输的数据在公网环境中面临被截获和窃取的风险,因此数据加密成为保障通讯安全的核心原理。TLS/SSL协议作为业界标准,通过非对称加密进行密钥交换、对称加密保障传输效率,并利用数字证书实现身份认证,为数据传输提供了机密性、完整性和可信性三重保障。这一技术价值在于,它能有效防止中间人攻击和数据泄露,是构建安全网络应用的基石。在Java/Kotlin开发实践中,通过SSLSocket和SSLServerSocket可以便捷地

weixin_33845881的博客 527

CH34xUART 1.0.0 安卓库集成实战:适配Android 13,修复3个关键Bug

本文详细介绍了CH34xUART 1.0.0安卓库的集成实战,重点讲解了如何适配Android 13并修复3个关键Bug。内容涵盖现代Android开发环境配置、USB权限管理、串口参数设置以及性能优化技巧,帮助开发者高效实现USB串口通信功能。

weixin_30603633的博客 388

maven升级导致kotlin编译不通过

maven升级导致kotlin编译不通过一、报错信息二、错误原因三、解决办法 一、报错信息 java.lang.IllegalAccessError: class com.intellij.util.io.FileChannelUtil (in unnamed module @0x26c1f3eb) cannot access class sun.nio.ch.FileChannelImpl (in module java.base) because module java.base does not ex

m0_37702282的博客 2626

Mac/安卓也能玩硬件!跨平台USB-GPIO控制指南:以沁恒CH9101系列为例

本文详细介绍了如何在Mac和安卓平台上实现跨平台USB-GPIO控制,以沁恒CH9101系列芯片为例。文章涵盖了驱动安装、权限配置、代码实现及性能优化等关键步骤,特别适合硬件开发者在非Windows环境下进行高效开发。CH9101凭借其电压自适应能力和成熟的驱动生态,成为跨平台硬件开发的理想选择。

weixin_30587927的博客 342

Android CH340驱动实现和单片机串口通信(串口转USB)Kotlin语言实现

序言 今天领导订做了一个单片机,连接处是USB口的,然后调完没问题之后呢,把连接方法写下来了。 由于是Kotlin语言写的,可能对纯Java的朋友不太友好,望多包涵。 CH340驱动下载地址: http://www.wch.cn/download/ch341ser_android_zip.html 注意事项和说明: 1.解压完成后把jar包导入到自己项目中 2.initUSB方法为核心代码包含了权限检查和驱动配置 3.baudRate或者其他变量要根据具体情况改变 4.startTh.

赵星海 2645

学习笔记-Kotlin(3)

目录 1.字符串操作 2.数字类型 3.标准函数库 (1).apply (2).let (3).run (4).with (5).also (6).takeIf和takeUnless 1.字符串操作 indexOf():用法跟java相同 substring():字符串截取。跟java相同,但其中有一种用法是subString(range:Int) "frenk".su......

FrenkX72的博客 653

Kotlin学习之旅(D14)-学习资料汇总

首先祝所有程序员1024节日快乐 我们也来到了Kotlin学习之旅的最后一天 今天的主题是:学习资料汇总 文章目录前言官方文档文档类在线编程书籍《Kotlin in Action》《Kotlin for Android Developers》《Programming Kotlin》总结视频Youtube - Kotlin TutorialB站- 黑马Kotlin教程其他视频[Introductio...

BlueLzy的个人博客 938

视频情感分析新思路:拆解CH-SIMS数据集的模态差异与标注技巧

本文深入探讨了视频情感分析的新思路,重点解析了CH-SIMS数据集的核心价值。该数据集通过为文本、音频、视觉模态提供独立的细粒度情感标签,揭示了情感表达的复杂性与模态间差异,为克服传统多模态情感分析中特征同质化问题提供了关键数据支持。文章进一步阐述了如何利用这种标注方法设计多任务学习框架,以构建更精准、可解释性更强的模态感知模型。

sss66的博客 502
上一篇: 《Kotlin入门实战》CH7 | 集合类
下一篇: 《Kotlin入门实战》CH9 | 文件IO,正则和多线程
KriyWu
博客等级 码龄9年 3粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值