首页
学习
活动
专区
圈层
工具
发布

Kotlin泛型的型变之路

kotlin修炼指南7之泛型 泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查...通用泛型类型:T,S,U,V 集合元素泛型类型:E 映射键-值泛型类型:K,V 数值泛型类型:N 要理解Kotlin的泛型,我们最好首先从Java的泛型来学习,毕竟Kotlin的语法糖太多了,Java会更加白话文一点...在学习了Java泛型之后,我们再来看下Kotlin的泛型,这时候你再看,就没那么复杂了,核心就两条。 使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ?...类型,我们也可以在运行时获取泛型类型,这个方法是Java和Kotlin都支持的,这个在前面的文章中也提到了。...❞ PESC PESC是泛型型变中的一个指导性原则,意为「Producer Extend Consumer Super」,当然在Kotlin中,这句话要改为「Consumer in, Producer

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

    kotlin--泛型

    kotlin作为一种高级语言,也提供了泛型,它的泛型比Java更为灵活 一、泛型类 1.定义泛型类 定义泛型类和Java差不多 class Magic(_item: T) { var subOject...val magic = Magic(Boy("danny", 15)) magic.available = true println(magic.getItem()) } 2.多个泛型参数的函数...1.如果想要对传递的泛型作约束,可以指定泛型的父类 //指定父类 class Magic(_item: T) { var subOject: T = _item...: com.aruba.mykotlinapplication.Man@3cd1a2f1 而Java中泛型只能使用对应的泛型,没有继承关系 6.reified kotlin也不允许对泛型作类型检查,当我们想要知道泛型参数具体是哪个类型时...,可以使用reified关键字修饰 reified必须和inline配合使用,原因是编译的时候,编译器就需要知道我们传入的类型,只不过代码写成了泛型而已 class Magic { inline

    65010

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

    下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型..., 泛型 T 的实际类型是 String 类型 , 在 logT 中 泛型 R 的类型是 Double 类型 ; student2 实例对象中 , 泛型 T 的实际类型是 Int 类型 , 在 logT...中 泛型 R 的类型是 Boolean 类型 ; 3.14 true 五、泛型类型约束 ---- 在 泛型类 , 泛型函数 中 , 使用泛型前 , 需要声明 泛型参数 : 泛型类 泛型参数 声明 :...return action(item) } 在 尖括号 中声明 泛型参数 时 , 可以指定 泛型类型 的 约束 , 如 泛型类型 必须是某个类型的子类 ; 在下面的代码中

    6K10

    Kotlin 泛型:基本使用

    泛型在 Kotin 的日常使用中运用很广泛:当我们使用 List、Array 等类型时,我们会使用到泛型类;当我们使用 apply、let 等函数时,我们会使用到泛型函数。...在 Kotlin 中声明和使用泛型类、泛型函数的基本概念和 Java 相似,有 Java 泛型概念的情况下,不用详细解释或者做进一步了解,也能够很容易地上手使用泛型。...但使用泛型仅仅是第一步,要想将泛型应用好,仍然需要做进一步深入的学习。本篇是 Kotlin 泛型的基础介绍,进阶内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。为什么需要泛型假如我们想实现自定义的列表类型,用于存放数值、字符串或其他具体的类型。...下一篇文章,将介绍 Kotlin 泛型的进阶知识:类型参数约束

    2.6K30

    Kotlin | 9. 泛型

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

    2.4K10

    Kotlin基础之泛型

    首先,Java中泛型为不可变类型,意味List不是List的子类型。为什么这样?如果List为可变量,List不会比Java的数组更好,并且下面的代码能够成功编译,但在运行时会引起异常。...此时安全地定义投影的泛型,每个泛型的具体实例都是泛型的子类型。 为此,Kotlin提供称为星号投影的语法。 对于Foo,T为带有上界TUpper的协变量,Foo等价于Foo。...val l = SingletonList(1) 泛型约束 所有可以被指定类型参数替代的类型,都可以使用泛型约束进行限制。...上界 最常见的泛型约束就是上界,对应java的extends关键字。...Cloneable { return list.filter{it -> threshold }.map { it.clone()} } 附:里氏替换原则协变与逆变泛型中的协变和逆变

    1.5K70

    kotlin入门之泛型

    【码上开学】Kotlin 的泛型 在学习kotlin 泛型之前我们先来回顾一下关于Java的泛型基础吧。 说道泛型,我们可能最常用的就是在三大集合中去使用。...说完了Java的泛型之后,我们在回头看一下kotlin中的泛型。 kotlin 中的out和in kotlin和java泛型一样,kotlin中的泛型本身也是不可变的。...当泛型类作为泛型参数类实例的消费者时用协变 *号 *号 前面讲到了 Java 中单个?...号也能作为泛型通配符使用,相当于 ? extends Object。 它在 Kotlin 中有等效的写法:* 号,相当于out Any。...伪泛型:编译时擦除类型,运行时无实际类型生成 例如:java、kotlin 真泛型:编译时生成真实类型,运行时也存在该类 例如:C#、C++ 我们知道JVM上的泛型,一般是通过类型擦除来实现的

    1.8K20

    Stack集合与枚举、泛型

    基本的方法有push和pop方法,还有peek得到栈顶的元素,empty方法是测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚刚创建的时候是空栈。...接着分别构建两个Stack集合对象,再使用两个循环将两组char数组里的元素分别压进两个栈中。...再声明一个int变量来记录进位,使用一个循环遍历栈中的元素,在循环里申请两个变量来记录每次出栈的数字,还需要将每次出栈的数字分别转换成整数类型,然后再存放到事先申请的两个变量中。...泛型: 泛型是在JDK1.5之后才有的,泛型要特定的类才可以做泛型,没有声明泛型的类是不能够使用泛型来操作的。泛型其实就是用来规定集合里面能够存储什么类型的,泛型也就只有集合里才用得到。...在泛型还没出现之前: ? ? 泛型出现后: ? ? 泛型的一些使用方式: ? 的使用: ? ?

    79820

    Kotlin 泛型之类型擦除

    Java 泛型的优点包括: 类型安全 消除强制类型转换 避免了不必要的装箱、拆箱操作,提高程序性能 提高代码的重用性 下面,以我的缓存框架 RxCache 中 Memory 接口为例: package...Kotlin 泛型 Kotlin 基于 Java 6,因此 Kotlin 天生支持泛型。但是 Kotlin 的泛型有自己的特点。...因为,Java 数组是协变的,所以 Java 数组不支持泛型。 协变是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语。 四....Kotlin 如何获得声明的泛型类型 跟 Java 一样,Kotlin 也是通过类型擦除支持泛型。 但是 Kotlin 的数组支持泛型,因此它们并不会协变。...Kotlin 的泛型远不止这些,后续的文章会进一步介绍泛型的协变和逆变。

    2.8K30

    Kotlin 泛型:类型参数约束

    上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...我想 QA 同学在回归其他打印机设备的时候,心里想得肯定是给编写代码的你寄刀片吧?利用范型约束实现非空范型Kotlin 有一个为人称道的特性:不可空。但当我们使用范型时,这个特性在不幸的失效了。...中的泛型属性也同样变得可空,这使得泛型类在具体实现的时候,需要考虑参数为空的情况,也让编写代码的具体实现变得复杂。

    4.4K31

    Kotlin学习笔记(七)-泛型

    前言 这节我们说下Kotlin的泛型。...首先默认大家对Java泛型有个基本的认识,如果 不熟悉Java的泛型,可以阅读文章,或是看下Java《Java核心技术卷一基础知识第10版》中关于泛型章节的知识,讲述的也很详细。...其实Kotlin的泛型和Java很相似。他们都是伪泛型,所谓伪泛型就是我们们是无法获取到泛型的具体的类型的。以为Java存在类型擦除和转换。...本篇还是和反射一样,从实际代码编写角度,说下Kotlin的泛型 逆变与协变 泛型的逆变与协变其其在Java中也有。简单概括来说就是实现了泛型的协变,Kotlin中的协变与逆变 泛型参数即可作为传入的参数,也可以作为返回值,但被in和out关键字修饰后就不一样了 out 叫协变 只能作为返回值读取 不能写入和修改(Kotlin的list中只有get方法

    97520

    Kotlin 进阶 泛型知识详解

    前言 详细介绍Kotlin中关于泛型的知识。方便我们理解泛型在Kotlin中的使用。 如果对于泛型知识不太了解,也可以通过本篇文章了解泛型到底是什么,并且对我们开发到底有什么作用。...我们可以在函数声明,属性声明,类声明和接口声明中使用泛型。下面也从这四个维度进行介绍泛型在Kotlin中的使用。 1.声明泛型函数 例如,我们声明一个比较函数。...在Kotlin中的泛型定义和java中其实很类似。都是使用来进行标注。 小知识:泛型并不是必须用T字母来代替。...1.1 多类型定义 我们在上面的示例中只是定义了一种泛型,那么如果有两种甚至更多的数据定义为泛型呢?下面就来介绍多种泛型类型的定义。...我们默认没有定义泛型类型其实就是省略了:Any类型而已。 2. 声明泛型属性 我们在上面的示例中了解了泛型的定义,在函数中的使用。下面我们介绍在类属性中的泛型声明和使用。

    72930

    Android面试题之Java 泛型和Kotlin泛型

    ,调用的时候会进行类型的强转,转为T的限制类型 泛型擦除后,字节码中没有泛型信息了,但是类的常量池里保留了泛型信息。...泛型信息String不存在了 泛型在静态方法和静态类中的问题 因为泛型类中的泛型参数的实例化是在定义泛型类型对象时候指定的,而静态成员是不需要使用对象来调用的,所有对象都没创建,无法确定泛型参数; 静态方法中是可以的...,因为调用的时候可以确定参数中的泛型类型 泛型类型中的方法冲突 因为擦除后2个equales方法变成一样的了,参数都会变成object @Override public boolean equals(Object...都没有半毛钱关系; 比如Apple继承自Fruit,那Plate和Plate也没有任何关系;也就是说苹果是水果,但装苹果的盘子不是装水果的盘子 继承关系中,泛型可以有多个,但如果有一个泛型参数是一样的...在必要时插入类型转换以保持类型安全 生成桥方法以在扩展时保持多态性 Kotlin泛型 Kotlin的泛型可以看文章:Android面试题之Kotlin泛型和reified关键字 END 点亮【赞和在看】

    48910

    kotlin修炼指南7之泛型

    Kotlin在Java的基础上,同样对泛型语法进行了拓展,所以很多Kotlin开发者,看着源码中的一堆in、out和*,感觉非常不知所措。...其实,只要了解了Java泛型,那么Kotlin泛型就迎刃而解了。 首先,我们来想想,我们为什么需要泛型。...Kotlin,或者说Java的泛型,实际上是一种伪泛型,即泛型只在申明时检查泛型是否有效,在编译时,泛型类型会被擦除,这是因为Java的历史原因所导致的,由于它为了兼容没有泛型的老Java版本,从而做出的妥协...星型投影 星型投影,其实就是Java中的「?」通配符,用于在泛型的使用中,去除泛型的依赖,这么说有点抽象,简单的说,就是当你不关心具体的泛型类型时,就可以使用「?」或者「*」来忽略泛型的约束。...那么在Kotlin中,可以将这种在使用时的协变,变为申明时的协变,代码如下。

    1K30

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

    都使用 T 来表示泛型 ; 代码示例 : 下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型...FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer 类型 , 在 Java 中这种用法不行 ;...// FastFoodFactory 是 Producer 子类 // Producer 的泛型参数 FastFood 是 Food 的子类 // 在 Kotlin...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    6.5K11

    Java入门(16)-- 枚举类型与泛型

    泛型的出现不仅可以让程序员少写一些代码,更重要的是它可以解决类型安全问题,泛型提供了编译时的安全检查,不会因为将对象置于某个容器中而失去其类型。...,正值代表方法中参数在调用该方法的枚举对象位置之前;0代表两个互相比较的枚举成员的位置相同;负值代表方法中参数在调用该方法的枚举对象位置之后。...真正的类型,而在使用类中的方法传递或返回数据类型时将不再需要进行类型转换操作,而是使用在声明泛型类对象时“”符号中设置的数据类型。...限制泛型可用类型 默认可用使用任何类型来实例化一个泛型类对象,但Java中也对泛型类实例的类型作了限制。...使用类型通配符 在泛型机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象时时限制这个泛型类的类型实现或继承某个接口或类的子类。要声明这样一个对象可以使用“?”

    1.2K30
    领券