Kotlin学习(一)—Kotlin的泛型

【kubernetes】kubernetes kubeadm init 错误了 怎么回退? 因为虚拟机设置问题首先报错:然后我根据文章修改了核数。重启后,查看VIP运行所在机器,发现机器没有变化然后重新执行初始化后面报错了根据提供的信息,问题主要集中在 kubelet 未能成功启动控制平面组件,导致初始化过程超时。以下是可能的原因及相应的排查步骤:原因 1:kubelet 未运行或运行状态异常正如错误提示所指出,kubelet 可能未运行或处于不健康状态。请按照提示执行以下命令检查 kubelet 的状态和服务日志:根据输出结果,判断 kubelet 是否正常运行。后续一大堆错误。 阅读详情

前言

在Kotlin中使用泛型的方式跟Java大体类似,其中也有一些特性的差别。不论是Java中的泛型还是Kotlin中的泛型,总有些概念会让人产生困惑。接下来回结合Java的泛型来学习Kotlin的泛型。

Kotlin中泛型的使用

在泛型的使用中,最常用到的就是泛型函数以及泛型类。在介绍这两种方式的使用之前,先介绍一下泛型的类型参数。

泛型类型参数

泛型的类型参数就是在声明泛型时定义的类型形参,表明了在使用泛型时定义的一种类型。在泛型实例化是类型形参就被替换成了类型实参。比如:List 实例化为 List时,类型形参T就被替换成了类型实参String。

由于泛型是在Java 1.5时引入Java的,为了兼容老版本,在Java中允许使用没有类型形参的泛型。比如:List list = new ArrayList();这种生命是允许存在的。但是在Kotlin中泛型声明必须声明类型形参或者能够推导出类型形参。比如:val list = listof(“a”, “b”);类型形参被推倒为String类型或者List直接声明为String类型。

泛型函数以及泛型类

//泛型函数
fun <T> someFunc(item: T): List<T> {
    // do something
}
//泛型类
class Hello<T> {
    val value: T
}

可以看到,在kotlin中使用泛型函数跟泛型类的方式与Java大致相同。除此之外,Kotlin还支持为一个类型制定多个约束的特性。

参数类型约束

在Kotlin中可以为类型参数指定约束,比如:fun sum() T,这个泛型函数指定了类型参数的上限为Number类型,那个类型参数只能是Number或者Number的子类。这个在Java中的表示是extends实现,即:

。

处了上面的约束外,Kotlin还可以指定多个约束。

fun <T> someFunc(value: T) where T : CharSequence, T : Appendable {
	if (!value.endsWith('.')) {
		value.append('.')
	}
}

上面这个泛型函数就指定了多个类型参数约束,在上面的情况下,类型参数必须实现CharSequence和Appendable两个接口。

类型参数的空与非空:在Kotlin中每个类型都有空与非空两种情况,实现泛型时也是如此。比如:List<String?>声明类型参数为一个可空的String类型,而List声明类型参数为不可空的String类型。

运行时的泛型

和Java一样,在运行时Kotlin的类型信息也会被擦除,类型擦除随之带来的就是类型的消失。

类型擦除在Kotlin中的影响
  • 函数参数受到类型擦除的影响,比如:fun func1(list: List); fun func2(list: List);这两个使用List泛型,受到类型擦除的影响,在运行时,无法分辨两个函数参数的差异;
  • 类型检查,在类型擦书后,运行时无法检查对应的类型。比如 value is List,在Kotlin中的替代方式是value is List<*>,利用星号投影检查。
实化类型参数

实化类型参数的意思就是可以使用类型参数。这个特性是Kotlin中加入的,通常是在内联函数

inline fun <reified T> isA(value: Any) = value is T

可以看到在内联函数中可以直接使用类型参数T。这样的代码在普通函数中是不能正常编译的(会爬出异常Error: Cannot check for instance of erased type: T)。可以在内联函数中使用是因为内联函数直接以字节码的形式插入到调用的地方,所以在运行时可以获取到类型实参。还有就是reified关键字的作用就是声明了类型参数在运行时不被擦除。

Kotlin中的型变

不变型

Kotlin的不变型指的是:例如,对于两种任意类型A和B,MutableList既不是MutableList的子类型也不是超类型,那么成为在该类型参数上是不变型的(Java中所有的类型都是不变型的)。

协变

在Kotlin中对于一个泛型类,如果A是B的子类型, SomeClass就是SomeClass的子类型,也就是说子类型被保留了,这样就是协变。

//类被声明成在T上协变
class SomeClass<out T> {
	fun someFinc(): T
}

上面的代码中就是声明协变的方式,即加入out关键字。协变只能生产类型T而不能消耗类型T,比如:只能get不能set,也就是协变是只读的。

在Java中与之对应的是<? extends T>的上界通配符。

逆变

在Kotlin中逆变可以看做是协变的镜像,下面是声明逆变的方式。

//声明逆变类型
interface Comparator<in T> {
	fun compare(e1: T, e2: T): Int {} //声明逆变使用in关键字
}

逆变可以写入,但是返回只能是基础类型。

在Java与之对应的是<? super T>下界通配符。

星号投影

而在 Kotlin 中,在参数类型未知时,可以用星投影来安全的使用泛型。但是MutableList<*>与MutableList<Any?>是不一样的。MutableList< * >相当于MutableList<out Any?>,是只读的。因为不明确具体类型的情况下,读是安全的,写是不安全的。

在Java中与之对应的是<?>无界通配符。

总结

Kotlin中的泛型与Java是相同的,处了几个Kotlin新加入的特性(比如:多约束类型,实化参数等),其他都与Java相通。

以上内容并没有讲明更多的细节,只是列出了Kotlin中泛型的内容以及与Java泛型的联系。感兴趣的同学可以继续深入学习。

MimicKit 人形机器人强化学习全身模仿控制算法使用教程 本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。 阅读详情

相关推荐

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6565

Kotlin - 泛型 <T>

用处:消除类型强转的烦恼,保证类型安全。 泛型约束 形变 & 协变 Kotlin Java in T 逆变 ? super T 下限通配符 out T 协变 ? extends T 上限通配符 ...

HugMua的博客 4598

mobaXterm连接vmWare虚拟机上的centOS7提示连接失败的解决方法

1.问题描述: mobaXterm安装后连接虚拟机vmWare上的centOS7发现连接不上,如下图所示: 2.解决方法 先是查了一下centOS的ip 开始错误的以为 virbr0: 后面的inet就是虚拟机的IP 实则不然(正确的ip是在ens33后面的inet中的ip,大佬们勿喷) 这个值需要配置一下的,具体配置过程如下: step1: 进入centOS下的/...

hss19214的博客 7890

Kotlin基础(八):泛型

本文主要讲解kotlin泛型,主要包括泛型基础,类型变异,类型投射,星号投射,泛型函数,泛型约束,泛型在Android中的使用。

分享计算机基础,android,C/C++,音视频等内容 2410

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 251

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

Kotlin系列五:泛型及其高级特性

目录 一 泛型 1.1 泛型类 1.2泛型方法 1.3 限制泛型类型 二 类委托和委托属性 2.1类委托 2.2委托属性 三泛型的高级特性 3.1泛型实化 3.2泛型的协变 3.3 泛型的逆变 一 泛型 1.1 泛型类 class MyClass <T>{ fun method(param :T): T { return param } } val myClass =MyClass<Int> () val...

许进进的博客 6141

【AI编程】Vibe Coding 开发环境搭建与项目实战操作详解

Vibe Coding 开发环境搭建与项目实战操作详解

congge 7335

Kotlin泛型

学习目标: 学习泛型,应用场景,学以致用 学习内容: 1.泛型的基本概念 2.泛型约束 3.泛型的形变 4.UnsafeVariance 5.星投影Start Projection 6.泛型的实原理与内联特化 学习时间: 时间就像海绵里的水,挤一挤总会有的 学习开始: 第一节:泛型的基本概念 1.泛型的概念 泛型是一种类型层面的抽象 泛型通过泛型参数实现构造更加通用的类型的能力 泛型可以让符合继承关系的类型批量实现某些能力 //函数生命泛型 fun &lt...

你的益达啊 2772

【异常】XXL-job触发调度:address:http://192.168.x.x:x/ code:500 msg:xxl-rpc remoting error(connect timed out)

XXL-JOB调度任务失败分析:调度中心(10.254.234.80)与执行器(192.168.x.x)连接超时,返回500错误。主要原因是网络不通或执行器异常:1.网络不通可能由防火墙或网段隔离导致;2.执行器未启动或端口未监听;3.地址配置错误。解决方案:1.关闭代理使用内网;2.测试网络连通性和端口可用性;3.检查执行器进程状态和端口监听情况;4.核对执行器地址配置;5.必要时配置防火墙规则放行端口。

奶爸的编程之路,也就一周冷个三天 414

LVGL core disp显示设计(lv_disp.c)

lv_disp.c当前显示页面的配置scr_act在原始的LVGL是以screen的概念存在,但我们还是习惯叫它为一个页面提供获取top_layer、sys_layer、prev_scr图层接口配置主题管理默认的主题管理是递归查找的,实际项目中因此页面的复杂性,虽然也兼容了此主题管理的方案,但还是推荐使用单页面自行管理主题的方案壁纸设置多页面切换的动画支持计算无用户操作时间清理显示缓存。

Bigan(安)的博客 2331

十四、Kotlin进阶学习:一、内联函数 inline;二、泛型;三、泛型约束;四、子类与子类型;

Kotlin进阶学习:一、内联函数 inline;二、泛型;三、泛型约束;四、子类与子类型;

weixin_43936741的博客 395

[特殊字符] 2026终极实战:Python爬取得物App球鞋实时交易价格 —— 从签名破解到数据可视化全栈指南

价格敏感度:热门鞋款(如Air Jordan 1、Yeezy 350、Dunk SB)价格每分钟都在波动,短线套利空间巨大。稀缺性:限量发售、联名款、地区限定,导致供需关系实时变化。数据壁垒:得物App使用自研WMS签名算法设备指纹绑定动态请求头加密,是爬虫工程师的“练兵场”。本博客将手把手带你从零搭建一套生产级得物球鞋价格爬虫系统,涵盖:抓包与逆向分析(mitmproxy + Frida)签名算法逆向(Python复刻)设备模拟与心跳保活(ADB + uiautomator2)

2201_76125261的博客 1125

Kotlin泛型学习篇

有时你想说,你对类型参数一无所知,但仍然希望以安全的方式使用它。这里的安全方式是定义泛型类型的这种投影,该泛型类型的每个具体实例化都会是该投影的子类型。仅使用 Kotlin 时,您不太可能需要显式声明绝对不可为 null 的类型,因为 Kotlin 的类型推断会为您处理此问题。这么做毫无意义, 因为我们可以像以前一样在该对象上调用所有相同的方法,所以更复杂的类型并没有带来价值。由于类型擦除,并没有通用的方法在运行时检测一个泛型类型的实例是否通过指定类型参数所创建 ,并且编译器禁止这种。但这样会有一些影响。

子冉冰清的博客 2057

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

聊一聊Kotlin的泛型

Kotlin的泛型 简介 与java一样,kotlin也支持泛型,用法和java泛型差别不大,kotlin特色是型变支持。 基本用法: 定义类: 跟java相同,定义在类后面的尖括号: open class Basket&amp;lt;T&amp;gt;{ } 定义方法: 定义在fun 关键字和 方法名之间。 //java public &amp;lt;S&amp;gt; void testFunction(...

SoulQw(思忆) 3955

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Kotlin-泛型

概述一般类和函数,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的约束对代码的限制很大。而OOP的多态采用了一种泛化的机制,在SE 5种,Java引用了泛型。泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时

行云间 1万+

Kotlin 泛型

Kotlin 泛型定义、where 约束、内联具象化泛型函数、in 和 out。

Chanwing Chow的博客 1115

Kotlin系列之泛型以及与Java中泛型的区别

泛型只在编译期间有效,运行期间会被擦除,所以泛型信息会消失,Java基于栈的形式调用方法得不到泛型的具体类型,Kotlin通过内联机制,编译期间是把方法直接添加到了对应的代码中,不存在栈调用的问题,所以可以通过上下文推导出泛型的具体类型。

小孟来码的博客 6922

kotlin之泛型的使用

泛型 我们最先了解到的泛型应该是来自于Java,在Java SE 1.5的时候,首次提出了泛型的概念,泛型的本质是参数化的类型,也就是说传递操作的数据类型被指定为一个参数,泛型可以被应用于类(泛型类)、接口(泛型接口)、方法(泛型方法)。Java引入泛型的好处就是安全简单。在Java SE 1.5之前,没有泛型的情况下,对参数的“任意化”是通过Object的引用来实现的,然而用这种...

fb0122的博客 5627

_Kotlin_系列_ 二、Kotlin泛型

其实通过上面两个例子可以发现,当我们定义一个子类继承一个泛型父类,并给这个泛型一个类型,我们就可以获取到这个泛型类型//定义一个子类继承泛型父类,并给这个泛型一个实际的类型//匿名内部类,其实我们定义的这个匿名内部类也是一个子类,它继承了泛型父类,并给这个泛型一个实际的类型因此如果我们想要获取某个泛型类型,我们可以通过子类的帮助去取出该泛型类型,一种良好的编程实践就是把当前需要获取的泛型类用 abstract 声明1)、当你只想读取值的时候,使用extends T>

2401_84408437的博客 1063

Kotlin 中的泛型

点此进入:从零快速构建APP系列目录导图点此进入:UI编程系列目录导图点此进入:四大组件系列目录导图点此进入:数据网络和线程系列目录导图一、泛型基础泛型编程包括,在不指定代码中使用到的确切类型的情况下来编写算法。用这种方式,我们可以创建函数或者类型,唯一的区别只是它们使用的类型不同,提高代码的可重用性。这种代码单元就是我们所知道的泛型,它们存在于很多的语言之中,包括Java和Kotlin。在Kotl

WillFlow的博客 3673

Kotlin的泛型:泛型类型参数

Kotlin 的泛型是指带类型形参的类型。当泛型的实例被创建时,类型形参被替换为具体类型。 ​ 以 Kotlin 的 list 方法为例,当创建一个字符串列表时,类型形参 T 被替换为具体类型 String。 val strList: List<String> public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init) 除了 L

okclouderx的博客 5108

Kotlin 泛型 VS Java 泛型

和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪泛型,和 Java ...

qxf865618770的博客 3630

转向Kotlin——泛型

无论是Java还是Kotlin,泛型都是一个非常重要的概念,简单的泛型应用很容易理解,不过也有理解起来麻烦的时候。 泛型基础 在了解Kotlin的泛型之前,先来看看Java中的泛型: 举个栗子:在JDK中,有一类列表对象,这些对象对应的类都实现了List接口。List中可以保存任何对象: List list=new ArrayList(); list.add(55); list.add(&amp;quot;...

jiashuai94的博客 1953

Kotlin学习历程——泛型

Kotlin语言中文站 简单回顾Java泛型 泛型是什么 Java在JDK5中引入了泛型机制。 它的意思可以理解为把具体的类型 参数化,编码时用符号代替类型,实际使用的时候再传入确定的类型,可以用在类、接口或者方法上面。 那么泛型的作用是什么呢?先看一段代码。 public final class Main { public static void main(String[] args) { /** * 案例场景 * * 同事.

hepingdev的专栏 2357

Kotlin泛型的型变之路

点击上方蓝字关注我,知识会给你力量之前就写过一篇泛型的文章,但是总觉得写得不够系统,所以最近对泛型又作了些研究,算是对这篇文章的补充了。kotlin修炼指南7之泛型泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查,不然就会转换异常。所以,我们需要将这种检查前置...

eclipse_xu 1562

Kotlin 之泛型详解

文章目录泛型约束泛型的型变UnsafeVariance星投影泛型实现原理内联特化案例: 泛型约束 fun <T : Comparable<T>> maxOf(a: T, b: T): T { if (a > b) { return a } return b } fun <T> callMax(a: T, b: T)...

345丶 1753
上一篇: Glide学习(一)—工作流程分析
下一篇: View中的Context是哪里来的
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值