首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

, 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性 主构造函数中可以接收 T 类型的实例对象作为参数...下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student...---- 函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ; 代码示例 : 该代码中 , 泛型函数 logT 的 参数 和 返回值 都是 T 泛型参数 类型 ; class...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字

2.9K10

【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )

---- 函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ; 代码示例 : 该代码中 , 泛型函数 logT 的 参数 和 返回值 都是 T 泛型参数 类型 ; class...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型...(t: T) } 十、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将 泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数...> 子类 , Producer 的泛型参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

4.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# 泛型集合的自定义类型排序

    一、泛型集合List排序 经sort方法之后,采用了升序的方式进行排列的。...在int类型中实现了IComparable,所以可以通过Sort()直接排序; ? int类型是实现了IComparable这个接口的。...三、对集合按照多种不同规则进行排序 实际使用中,经常需要对集合按照多种不同规则进行排序,这就需要定义其他比较规则,可以在Compare方法中定义,该方法属于IComparer泛型接口,请看下面的代码...其中的Comparer.Default返回一个内置的Comparer对象,用于比较两个同类型对象。...下面用新定义的这个比较器对集合进行排序: //================对集合按照多种不同规则进行排序========================= List< Person

    1.4K10

    表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数

    表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数 目录 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数 一,定义变量 二,访问变量/类型的属性字段和方法 1....调用函数 调用静态类型的函数 调用实例的函数 三,实例化引用类型 new 给属性赋值 创建引用类型 示例 四,实例化泛型类型于调用 五,定义集合变量、初始化、添加元素 ?...调用函数 使用 Expression.Call() 可以调用一个静态类型的函数或者实例的函数。...= lambda2.Compile()(); Console.WriteLine(sample); Console.ReadKey(); 四,实例化泛型类型于调用...创建集合类型,需要使用到 ElementInit 表示 IEnumerable集合的单个元素的初始值设定项。 ListInit 初始化一个集合。

    1K20

    Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

    三、泛型集合的支持         这一特性和Nullability一样,只作用于编译期,是为我们开发者服务的另一重要特性。...1、有类型约定的集合         在Xcode7中,我们可以给集合类型添加一个泛型的约定,如下:  NSMutableArray *array = [[NSMutableArray...激动吧,使用点语法可以访问到数组中泛型的方法了,还有更加诱人的: ? 在我们向这个数组中追加元素的时候,编译器将元素的类型提示了出来,并且将FromArray方法中需要的元素类型也提示了出来。...3、关于多参数的泛型集合         多参数的泛型集合,有一个非常好的例子,就是NSDictionary,在Xcode7中我们可以这样写字典: ?...4、协变性与逆变性         因为有了泛型集合的概念,相比之前,我们的类型实际上更加复杂了,比如还拿我们自定义的集合类型来举例:     MyArray * array;

    1.1K30

    【Flutter】Dart 数据类型 List 集合类型 ( 定义集合 | 初始化 | 泛型用法 | 初始化后添加元素 | 集合生成函数 | 集合遍历 )

    定义集合并初始化 ---- 定义并初始化 List 集合 : 定义集合 , 并对集合初始化 ; ① 集合元素数据类型 : 集合元素类型是泛型的 , 可以接受任何数据类型 ; ② 集合元素种类 : 如果没有指定泛型..., 集合中可以存放不同类型的元素 , ③ 举例 : 在一个未指定泛型的集合中同时存放 int , double , String , bool 类型的元素 ; ④ List 集合初始化添加元素 : 使用...集合泛型用法 ---- 集合泛型 : ① 指定泛型 : 如果集合声明时 , 指定了泛型 , 那么就只能存放该泛型类型的元素 ; ( 指定 int 泛型类型的集合 , 只能存放 int 类型的元素 ) ②...定义集合 //定义集合 , 并对集合初始化 // 集合元素数据类型 : 集合元素类型是泛型 , 可以接受任何数据类型 // 集合元素种类 : 如果没有指定泛型 , 集合中可以存放不同类型的元素...集合泛型用法 //如果集合声明时 , 指定了泛型 , 那么就只能存放该泛型类型的元素 // 如 : 指定 int 泛型类型的集合 , 只能存放 int 类型的元素 //

    95710

    Android数据库高手秘籍(十),如何在Kotlin中更好地使用LitePal

    要理解泛型实化,首先你需要知道泛型擦除的概念。 不管是Java还是Kotlin,只要是基于JVM的语言,泛型基本都是通过类型擦除来实现的。...也就是说泛型对于类型的约束只在编译时期存在,运行时期是无法直接对泛型的类型进行检查的。...例如,我们创建一个List集合,虽然在编译时期只能向集合中添加字符串类型的元素,但是在运行时期JVM却并不能知道它本来只打算包含哪种类型的元素,只能识别出来它是个List。...但是Kotlin中提供了一个内联函数的概念,内联函数中的代码会在编译的时候自动被替换到调用它的地方,这就使得原有方法调用时的形参声明和实参传递,在编译之后直接变成了同一个方法内的变量调用。...类型,那么find()方法就可以自动推导出泛型类型,从而不需要再手动进行的泛型指定了。

    3.1K30

    Kotlin泛型的型变之路

    所以,我们需要将这种检查前置到编译期,这样在编写代码时,就可以安全的使用不同类型,例如List,我们一看就知道是一个String类型的list,不能放其他类型的元素。...❝正是由于泛型擦除的问题,你甚至可以通过反射绕开泛型的限制,传递一个非当前泛型限制的对象。...通用泛型类型:T,S,U,V 集合元素泛型类型:E 映射键-值泛型类型:K,V 数值泛型类型:N 要理解Kotlin的泛型,我们最好首先从Java的泛型来学习,毕竟Kotlin的语法糖太多了,Java会更加白话文一点...但是这种处理在我们处理泛型业务时,会有很多限制,所以,泛型提供了「型变」来拓展泛型的使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而泛型的上界就是其父类。...Kotlin型变 泛型让我们有了可以支持多种类型的能力,型变让我们有了修改泛型的能力,总结来说: 泛型通配符<?

    1.2K21

    一文了解 JavaKotlin 中的泛型

    ,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的泛型」简称为「子类泛型」,「类型参数为父类的泛型...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得泛型类型协变了逆变同理,有时候我们希望把父类泛型对象作为实参传递给子类泛型的形参,例如// 用于监听小动物是否饿了的监听器...> 的子类协变和逆变的特性协变:上界能确定的是父类,对于泛型集合只读不可写逆变:下界能确定的是子类,对于泛型集合只写不可读// 协变,只读不可写private void covariance(ArrayList...,这样类型也就更加安全了,因此我说 —— Kotlin 泛型和 Java 泛型的加强版在介绍其他 Kotlin 泛型的 “加强功能” 之前,我们先了解一下: Java 上的泛型型变,到 Kotlin 之后如何实现和表示...泛型具体化(Reified)有时候我们需要在函数体中使用泛型的类型参数,获取类型参数的具体信息,比如对类型参数进行类型判断、类型转换等,因为类型擦除的原因,这个在 Java 中是无法实现的:public

    93720

    一文了解 JavaKotlin 中的泛型

    ,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的泛型」简称为「子类泛型」,「类型参数为父类的泛型...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得泛型类型协变了逆变同理,有时候我们希望把父类泛型对象作为实参传递给子类泛型的形参,例如// 用于监听小动物是否饿了的监听器...> 的子类协变和逆变的特性协变:上界能确定的是父类,对于泛型集合只读不可写逆变:下界能确定的是子类,对于泛型集合只写不可读// 协变,只读不可写private void covariance(ArrayList...,这样类型也就更加安全了,因此我说 —— Kotlin 泛型和 Java 泛型的加强版在介绍其他 Kotlin 泛型的 “加强功能” 之前,我们先了解一下: Java 上的泛型型变,到 Kotlin 之后如何实现和表示...泛型具体化(Reified)有时候我们需要在函数体中使用泛型的类型参数,获取类型参数的具体信息,比如对类型参数进行类型判断、类型转换等,因为类型擦除的原因,这个在 Java 中是无法实现的:public

    1.1K52

    《Kotlin 极简教程 》第6章 泛型

    我们知道,在数学中泛函是以函数为自变量的函数。类比的来理解,编程中的泛型就是以类型为变量的类型,即参数化类型。这样的变量参数就叫类型参数(Type Parameters)。...本章我们来一起学习一下Kotlin泛型的相关知识。 6.1.1 为什么要有类型参数 我们先来看下没有泛型之前,我们的集合类是怎样持有对象的。 在Java中,Object类是所有类的根类。...尤其在集合类中。我们可以发现大量的泛型代码。 本章我们通过对Java泛型的回顾,对比介绍了Kotlin泛型的特色功能,尤其是协变、逆变、in、 out等概念,需要我们深入去理解。...只有深入理解了这些概念,我们才能更好理解并用好Kotlin的集合类,进而写出高质量的泛型代码。 泛型实现是依赖OOP中的类型多态机制的。...Kotlin是一门支持面向对象编程(OOP)跟函数式编程(FP)强大的语言。我们已经学习了Kotlin的语言基础知识、类型系统、集合类、泛型等相关知识了,相信您已经对Kotlin有了一个初步的了解。

    1.8K30

    生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型

    生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 发布于 2018-01-31 05:38...更新于 2018-05-25 12:33 当你想写一个泛型 的类型的时候,是否想过两个泛型参数、三个泛型参数、四个泛型参数或更多泛型参数的版本如何编写呢?...} 注意到类型的泛型变成了多个,参数从一个变成了多个,返回值从单个值变成了元组。 于是,怎么生成呢?...于是,在 Program.cs 中调用以上代码即可完成泛型生成。我写了一个简单的版本,可以将每一个命令行参数解析为一个需要进行转换的泛型类文件。...Demo 级别的代码,我将生成的泛型个数直接写到了代码当中。

    1.4K20

    Android平台的Swift—Kotlin

    变量类型可以根据变量值进行自动推导。这里Kotlin的基础类型都是对象,使用的是Java的包装类(基础类型包装成对象)。 2、定义函数 [3.png] 函数使用fun为关键字进行声明。...为基本的运算符提供了固定名称函数表,比如 [24.png] 示例: [25.png] 调用: [26.png] 5、Lambda表达式 Lambda本质上是一个未声明的函数,他会以表达式的形式传递。...声明一个接受函数为参数的函数: [28.png] 第二个参数rightV表明接受的是一个函数,函数有两个Int型的入参,返回一个Int型的输出。...[33.png] 2、泛型 泛型的存在主要是为了消除模板代码和类型转换安全, 在Kotlin中泛型的使用基本与Java是一致的。...[34.png] 在Java中泛型是不变的,比如:虽然A继承B,但List和List之间没有任何关系,Java是通过泛型通配符来实现型变的: <?

    3.5K90

    是时候使用Kotlin编程了

    而当在Java代码中调用Kotlin对象时,Kotlin生成的class文件也要输入到Java编译器,这时Java文件才能生成正确的class文件。...2,泛型 泛型的存在主要是为了消除模板代码和类型转换安全, 在Kotlin中泛型的使用基本与Java是一致的。...在Java中泛型是不变的,比如:虽然A继承B,但List和List之间没有任何关系,Java是通过泛型通配符来实现型变的: 3,反射 反射是运行于JVM中的程序检测和修改运行时的一种行为,通过反射可以在运行时获取对象的属性和方法...this表达式 6.5 小结 第7章 数据类与密封类 7.1 数据类 7.1.1 对象复制 7.1.2 序列化 7.1.3 成员解构 7.2 密封类 7.3 小结 第8章 集合与泛型 8.1集合 8.1.1...集 8.1.2 列表 8.1.3 映射 8.2 泛型 8.2.1 泛型基础 8.2.2 型变 8.2.3 声明处型变 8.2.4 类型投影 8.2.5 星号投影 8.2.6 泛型函数 8.2.7 泛型约束

    3.3K10

    阿里云大神亲码“Kotlin深度笔记”,不讲一句废话,全是精华

    ; Kotlin 不会面面俱到,而是以补 Java 的短板为先,Kotlin 不会变成 C++。...基本类型、包、控制流、返回与跳转 image.png 3.类和对象 主要内容:类和继承、属性和字段、接口、可见性修饰词、扩展、数据对象、泛型、嵌套类、枚举类、对象表达式和声明、代理模式、代理属性 4.函数和...为什么要引入 Lambda 和 高阶函数? 带接收者(Receiver)的函数类型:A....(B,C) -> D HTML Kotlin DSL 实战 image.png Kotlin 泛型 遥控器的故事:泛型 招聘的故事:泛型的不变性(Invariant) 搞定招聘:泛型的协变(Covariant...) 填志愿的故事:泛型的逆变(Contravariant) 使用处型变(Use-site Variance) Kotlin 泛型实战 Kotlin 扩展 扩展是什么?

    1.1K10

    Kotlin | 9. 泛型

    和Java一样,Kotlin的泛型在运行时也被擦除了。...变型:泛型很子类型化 /**-------------------- 9.3.1 为什么存在变型:给函数传递实参 ----------------------*/ //...会提示报错 // println(Validators[String::class].validate(42)) 总结 Kotlin 的泛型和 Java 相当接近:它们使用同样的方式声明泛型函数和泛型类...变型是一种说明两种拥有相同基础类型和不同类型参数的泛型类型之间子类型化关系的方式,它说明了如果其中一个泛型类型的类型参数是另一个的类型参数的子类型 这个泛型类型就是另外一个泛型类型的子类型或者超类型。...在Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。

    1.8K10

    《Kotlin 程序设计》第三章 Kotlin 类型系统第三章 Kotlin 类型系统基本数据类型2.字符类型CharKotlin类型系统参考资料

    Kotlin泛型与类型安全 跟Java一样,Kotlin也支持泛型类: package com.easy.kotlin /** * Created by jack on 2017/5/30. */...T的类型是Int val box2 = Box(1) println(box2.value) 在Kotlin泛型中,数组类型Array是非协变的(Non covariant)。...首先,Java中泛型的参数化类型是非协变的(invariant),这意味着List并不是List的子类型。...为了最大程度的灵活性,在输入参数时使用通配符类型来表示生产者或者消费者。 关于Kotlin的泛型,更多可以参考[1] 类型别名typealias 类型别名为现有类型提供替代名称。...因此,当我们需要泛型函数类型时,可以传递该类型的变量,反之亦然: // 类型别名 typealias Predicate = (T) -> Boolean fun foo1(p: Predicate

    1.4K30

    Kotlin入门潜修之类和对象篇—泛型及其原理

    泛型 如果我们了解java中的泛型,那么本篇文章提到的kotlin泛型我们也不会陌生。但是如果之前没有接触过泛型或者没有真正理解泛型,本篇文章理解起来可能有些困难,不过我会尽量阐述的通俗易懂。...java中的泛型 前面一直有提到,kotlin是运行于jvm上的语言,其对标的语言就是java,因此我们先来讲一下java的泛型,了解了java泛型的优缺点之后,我们就很容易明白kotlin中泛型的设计初衷了...而假如我们在创建类型的时候也为其指定参数,这个参数又是个类型,那么我们就称之为泛型。 那么泛型的作用和意义是什么?使用泛型能够像传递参数一样传递类型,同时保证运行时的类型安全。...类型的传递能够让我们写一份代码就能满足各种类型的调用;类型安全是指编译器在编译代码期间会对泛型信息进行检查,只有符合规范的才能编译通过,这样可以有效避免运行时的ClassCastException异常。...可以通过addAll将Integer集合加入到Object集合!按照上面的分析,这显然是不可能的!

    93930

    kotlin修炼指南7之泛型

    Kotlin在Java的基础上,同样对泛型语法进行了拓展,所以很多Kotlin开发者,看着源码中的一堆in、out和*,感觉非常不知所措。...,指定List的类型为Person,这样Father、Son,这些子类就都可以加入到这个List。...上面就是一个比较简单的泛型的使用实例。 泛型不变性 Father和Son都可以作为子类,加入到Person的List中,这就是泛型,但是让我们再看下下面的代码。...Kotlin,或者说Java的泛型,实际上是一种伪泛型,即泛型只在申明时检查泛型是否有效,在编译时,泛型类型会被擦除,这是因为Java的历史原因所导致的,由于它为了兼容没有泛型的老Java版本,从而做出的妥协...在Kotlin中,集合类大量使用了协变,如下所示。

    65030

    第8章 泛型第8章 泛型

    第8章 泛型 通常情况的类和函数,我们只需要使用具体的类型即可:要么是基本类型,要么是自定义的类。...我们知道,在数学中泛函是以函数为自变量的函数。类比的来理解,编程中的泛型就是以类型为变量的类型,即参数化类型。这样的变量参数就叫类型参数(Type Parameters)。...在集合类API中大量地使用了泛型。在Java 中我们可以为类、接口和方法分别定义泛型参数,在Kotlin中也同样支持。本节我们分别介绍Kotlin中的泛型接口、泛型类和泛型函数。...通配符在类型系统中具有重要的意义,它们为一个泛型类所指定的类型集合提供了一个有用的类型范围。...编译器禁止某些泛型的使用方式,也正是为了确保类型的安全性。 本章小结 泛型是一个非常有用的东西。尤其在集合类中。我们可以发现大量的泛型代码。

    1.9K20
    领券