首页 > 其他分享 >kotlin 泛型基础

kotlin 泛型基础

时间:2023-11-16 09:11:18浏览次数:28  
标签:return kotlin 基础 ret fun 类型 泛型 List

一、泛型函数

如下是泛型函数的一种构造

在fun函数标记的右边增加该函数要使用的类型形参

fun <T> List<T>.slice(indices: IntArray): List<T> {
    val ret = mutableListOf<T>()
    for (v in indices) {
        ret.add(this[v])
    }
    return ret
}

listOf(3,4,5,6,7,8,1,2).slice(intArrayOf(4,5,3,2))

如上在调用slice之后,返回了一个新的List并且对应的类型为T

上述的调用也可以为:listOf<Int>(3,4,5,6,7,8,1,2).slice<Int>(intArrayOf(4,5,3,2))

这里listOf<Int>对应的List<T>, slice<Int>对应的fun <T> ;

但是为何实际不需要添加<Int>呢?是因为kotlin能够进行推理得到对应的类型!

 

二、泛型的扩展属性

这里强调扩展属性,是因为普通属性不能拥有类型参数,不能在一个类的属性中存储多个不同类型的值。例如:val <T> x: T = TODO()

如下是泛型的扩展属性的一个例子,返回列表的倒数第二个参数

val <T> List<T>.penultimate: T
get() = this[size - 2]

listOf(1,2,3,4).penultimate

 

三、泛型类

语法是:在类名称后加上一对尖括号,并把类型参数放在尖括号内来声明泛型类和接口。

interface Compareable<T> { // 这里声明一个接口,并且在该接口中声明了类型参数
    fun compareTo(other: T): Int
}

class String1(val value: String): Compareable<String1> { // 在实现的时候需要指明接口具体要具现的类型,这里可以使用类本身作为具现类
    override fun compareTo(other: String1): Int {
        return this.value.length - other.value.length
    }
}

    val string1 = String1("kk")
    println(string1.compareTo(String1("qqq")))

 

四、类型参数的约束

类型参数的约束可以限制泛型类和函数的类型实参的类型

指定泛型类型形参的上界即泛型类型必须为上界类型的子类型

如下是对应的例子

fun <T: Number> List<T>.sum(): Int { // 这里指定了上界是Number
    var ret = 0
    this.forEach { ret += it.toInt() } // 因为T 是Number或者Number的子类,所以这里可以调用toInt()
    return ret
}

listOf(1,2,3).sum()

 

2、带类型参数约束的函数

fun <T: Comparable<T>> max(first: T, second: T): T { // T 必须是一个可比较的类型
    return if (first > second) first else second
}

max("kk", "qqq")

 

3、如果要对T指定多个约束的话,则需要使用where关键字,多个约束的中间用逗号隔开,并且写在函数的最后面

fun <T> ensuretrail(seq: T): T where T: CharSequence, T: Appendable { // 这里返回的类型为T
if (!seq.endsWith('.')) {
seq.append('.')
}

return seq
}

 

4、当没有类型参数的约束时候,它的默认约束是Any? , 此时T是可空的类型,如果要让T非空则需要明确指定非空的类型

标签:return,kotlin,基础,ret,fun,类型,泛型,List
From: https://www.cnblogs.com/czwlinux/p/17835239.html

相关文章

  • 2023-2024 20231313《计算机基础与程序设计》第八周学习总结
    2023-202420231313《计算机基础与程序设计》第八周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第八周学习总结作业内容《计算机科学概论》第9章《C语言程序设计》第7章并完成云班课测试,功能设计与面向对象设计,面向对象设计过程,面向对象语......
  • 第6章 Qt GUI--界面编程基础
    QtGUI--界面编程基础认识设计师界面--每个窗口的功能及用法在UI设计师界面设计的属性会被QTwidget设计在这里面拖动拖放试试看属性是根据基础的父类从上到下排序的编辑和信号槽模式核心--信号槽的理解与应用(这里比较粗糙)QT和其他GUI框架最大的区别红灯是......
  • 零基础机器学习数字识别MNIST(on going)
    本人之前并未涉及机器学习,但是在嵌入式中都会涉及视觉,借校内比赛从零学习,进行MNIST数字识别模型的搭建。随着学习进度更新,每天更新。2023-11-1521:38:55星期三一、环境搭建进行本模型的搭建,需要以下内容:Python环境:利用Anaconda管理开源机器学习平台:PyTorch或Tensorf......
  • pgrep基础使用
    说明pgrep和pkill命令某种程度上可以理解成psaux|grep[pattern]的别名。pgrep就是找出所有符合pattern的processid,这个p实际上process的意思。pgrep用法同grep,用来过滤所有符合字符串模板的进程,并获取他们的pid。pkill同理。选项-u限定进程的所属用户。多个用户使......
  • 2023-2024-1 20231329《计算机基础与程序设计》第8周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标计算机科学概论第9章并完成云班课测试《C语言程序设计》第7章并完成云班课测试作......
  • 狂神Markdown基础操作学习记录
    Markdown学习标题一级标题:#+空格+标题二级标题:##+空格+标题三级标题:###+空格+标题四级标题:####+空格+标题以此类推(最多到六级标题)字体Hello,World!两边加上**:加粗Hello,World!两边一个*:斜体Hello,World!两边三个***:斜体加粗Hello,World!删除线:两边波浪号(注意英文输入法)......
  • Kotlin委托的深入解析与实践
    引言在Kotlin编程语言中,委托是一项强大的特性,它能够极大地简化代码,提高代码的可维护性。本文将深入探讨Kotlin中的委托机制,介绍其原理、具体使用方式以及实际应用场景。委托的原理委托是一种通过将实际工作委托给其他对象来实现代码重用的机制。在Kotlin中,委托通过关键字by来实现......
  • (十九)C#编程基础复习——交错数组
    C#中的交错数组其实就是元素为数组的数组,换句话说就是交错数组中的每个元素都可以是维度和大小不同的数组,所以有时交错数组也称为“数组的数组”。这一节比较复杂,用到的时候可以再深入挖掘,多敲代码练习总会出奇迹。一、声明交错数组交错数组声明语法:data_type[][]array_name;......
  • PS基础
    复位窗口:窗口-工作区-复位基本功能一、PS窗口布局顶部:菜单栏、选项栏左侧:工具栏(顶部箭头可双栏或单栏显示)中间:工作区右侧:面板区二、新建文件1)新建、保存、打开及撤销——快捷键Ctrl+N:新建文件Ctrl+S:保存(PSD)Ctrl+Shift+S:另存为(JPEG)打开文件快捷键:Ctrl+O;或直接把图片......
  • day10 函数基础
    day10函数入门目标:掌握函数的编写方式以及函数的基本使用。今日概要:初识函数函数的参数函数的返回值提示:由于昨天的内容比较多,为了减轻大家的学习压力,今天设计的课程内容会比较少。1.初识函数函数到底是个什么东西?函数,可以当做是一大堆功能代码的集合。def函数......