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

Kotlin学习笔记(七)-泛型

前言 这节我们说下Kotlin的泛型。...其实Kotlin的泛型和Java很相似。他们都是伪泛型,所谓伪泛型就是我们们是无法获取到泛型的具体的类型的。以为Java存在类型擦除和转换。...本篇还是和反射一样,从实际代码编写角度,说下Kotlin的泛型 逆变与协变 泛型的逆变与协变其其在Java中也有。简单概括来说就是实现了泛型的协变,实现了泛型的逆变。具体的这两种有什么特性可以看开头两篇文章。...list) 协变点:返回值类型是泛型类型参数 逆变点:入参类型是泛型参数的类型 @UnsafeVariance 型变点伪例(当时协变的时候 泛型作为参数入参会报错 那么如果我们想忽略这个错误那么我就可以用这个注解标识

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

    Kotlin 泛型:类型参数约束

    上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...什么是类型参数约束对于上述场景,最理想的实现应该满足这些条件:只有数值类型的列表才能调用这个拓展函数拓展函数对「类型参数」所具备的特征有必要的了解,如知道它是一个Number类型因此,我们需要使用泛型参数约束...我想 QA 同学在回归其他打印机设备的时候,心里想得肯定是给编写代码的你寄刀片吧?利用范型约束实现非空范型Kotlin 有一个为人称道的特性:不可空。但当我们使用范型时,这个特性在不幸的失效了。

    2.3K31

    Kotlin 新版本也有了交叉类型和联合类型?

    Kotlin 1.4-m1 发布之后,我曾整理了一下官方博客中提到的语法更新,见 Kotlin 1.4 新特性预览。...既然做不出选择,那为什么还要选呢?小孩子才做选择,我当然是都要啊! ? 图 2:Kotlin 1.4 对分支表达式的类型推导 这是什么情况?这个类型我没见过啊。...一旦产生了这样的类型,Kotlin 会采用类型近似、类型退化等手段来找到一个现有类型系统中合适的类型来表达它们。 4. 为什么不直接支持交叉类型和联合类型呢? 其实这个问题已经争论了挺久了。...支持引入这个特性的开发者提供的一些 use case 多数情况下可以通过诸如函数重载、泛型约束等特性来实现,有些情况下实际上更应该优化类型设计而不是寄希望于一个更复杂的类型系统。 存在滥用风险。...类型系统复杂一点点,带来的项目代码的复杂度提升可能都会是巨大的。这一点从 Kotlin 对函数类型的支持上就可见一斑,当然不同之处在于函数类型确实是刚需。 对于这个问题大家怎么看呢?

    1.4K20

    Kotlin泛型的型变之路

    kotlin修炼指南7之泛型 泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查...Kotlin型变 泛型让我们有了可以支持多种类型的能力,型变让我们有了修改泛型的能力,总结来说: 泛型通配符Kotlin支持了内联函数,所以它提供了一个更加方便的方式来处理这种场景,那就是「reified」配合「inline」来实现。...类型,我们也可以在运行时获取泛型类型,这个方法是Java和Kotlin都支持的,这个在前面的文章中也提到了。...通过对获取的genericType来判断是否实现ParameterizedType接口,是说明支持泛型,从而获取出对应的泛型列表(因为泛型可能有多个)。

    1.2K21

    一文了解 JavaKotlin 中的泛型

    阅读本文你将了解:什么是型变、协变、逆变和不型变在 Java 和 Kotlin 中如何实现以上型变Java 和 Kotlin 中泛型的异同在 Java/Kotlin 中,子类对象是可以赋值给一个父类类型的...,自然可以推导出到底什么时候可以编译通过了更多关于型变特性背后的设计原因,请参见我的另一篇文章:Effective Kotlin 译文:Chapter3-Item24-泛型的型变泛型约束Java 中还可以对泛型的类型参数做进一步限制...,这样类型也就更加安全了,因此我说 —— Kotlin 泛型和 Java 泛型的加强版在介绍其他 Kotlin 泛型的 “加强功能” 之前,我们先了解一下: Java 上的泛型型变,到 Kotlin 之后如何实现和表示...我们说 Kotlin 泛型是 Java 泛型的加强版,这一定是为了解决一些 Java 所不能支持的场景举例:一个确定只有只读能力的泛型类,使用声明处型变可以带来方便,不需要使用处每次指定// 该泛型接口方法只有读的能力...:使用 reified 修饰泛型之后,在方法内判断泛型是否是某个类型,很多人都是这么写的:String is T 这样其实是不对的,来看下如果这么写,反编译后对应的 java 的代码长什么样?

    93720

    一文了解 JavaKotlin 中的泛型

    阅读本文你将了解:什么是型变、协变、逆变和不型变在 Java 和 Kotlin 中如何实现以上型变Java 和 Kotlin 中泛型的异同在 Java/Kotlin 中,子类对象是可以赋值给一个父类类型的...,自然可以推导出到底什么时候可以编译通过了更多关于型变特性背后的设计原因,请参见我的另一篇文章:Effective Kotlin 译文:Chapter3-Item24-泛型的型变泛型约束Java 中还可以对泛型的类型参数做进一步限制...,这样类型也就更加安全了,因此我说 —— Kotlin 泛型和 Java 泛型的加强版在介绍其他 Kotlin 泛型的 “加强功能” 之前,我们先了解一下: Java 上的泛型型变,到 Kotlin 之后如何实现和表示...我们说 Kotlin 泛型是 Java 泛型的加强版,这一定是为了解决一些 Java 所不能支持的场景举例:一个确定只有只读能力的泛型类,使用声明处型变可以带来方便,不需要使用处每次指定// 该泛型接口方法只有读的能力...:使用 reified 修饰泛型之后,在方法内判断泛型是否是某个类型,很多人都是这么写的:String is T 这样其实是不对的,来看下如果这么写,反编译后对应的 java 的代码长什么样?

    1.1K52

    Kotlin基础之泛型

    而Kotlin没有任何的通配符类型,它使用声明处变型和类型投影两种方式替代。 通配符 - 使用问号表示的类型参数,表示未知类型的类型约束方法。 首先,先思考为什么Java需要这些难以理解的通配符。...首先,Java中泛型为不可变类型,意味List不是List的子类型。为什么这样?如果List为可变量,List不会比Java的数组更好,并且下面的代码能够成功编译,但在运行时会引起异常。...此时安全地定义投影的泛型,每个泛型的具体实例都是泛型的子类型。 为此,Kotlin提供称为星号投影的语法。 对于Foo,T为带有上界TUpper的协变量,Foo等价于Foo。...如果泛型有多个类型参数,则每个都可以独立投影。比如,如果类型声明为interface Function 泛型函数 不仅类可以有类型参数,函数也可以有。...String { // 扩展函数 // ... } 调用泛型函数,在调用的函数名之后指定具体类型参数。

    98870

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

    自从LitePal在2.0.0版本中全面支持了Kotlin之后,我也一直在思考如何让LitePal更好地融入和适配Kotlin语言,而不仅仅停留在简单的支持层面。...Kotlin确实是一门非常出色的语言,里面有许多优秀的特性是在Java中无法实现的。因此,在LitePal全面支持了Kotlin之后,我觉得如果我还视这些优秀特性而不见的话,就有些太暴殄天物了。...当然,很多人写着写着也就习惯了,这并不是什么大问题。但是随着我深入学习Kotlin之后,我发现Kotlin提供了一个相当强大的机制可以优化这个问题,这个机制叫作泛型实化。...接下来我会对泛型实化的概念和用法做个详细的讲解。 要理解泛型实化,首先你需要知道泛型擦除的概念。 不管是Java还是Kotlin,只要是基于JVM的语言,泛型基本都是通过类型擦除来实现的。...这样的话也就不存在什么泛型擦除的问题了,因为Kotlin在编译之后会直接使用实参替代内联方法中泛型部分的代码。 简单点来说,就是Kotlin是允许将内联方法中的泛型进行实化的。

    3.1K30

    C# - 实现类型的比较

    更好的办法是实现某种比较器。 但是有时候还是需要实现IComparable,那么下面就讲一下怎么做。 值类型 Person Struct: ? 如果直接使用我们之前的方法,则会报错: ?...但针对struct,其实还没完,还有一个非泛型的IComparable接口,泛型出现之前,一直都是用这个接口的。...引用类型 引用类型除了需要考虑上面struct考虑的那些东西外,还需要考虑更多的东西。 首先,需要在CompareTo里面检查是否为null,和类型检查。...针对泛型的比较,你需要使用IComparable.CompareTo()方法,而不是比较的操作符>, =, 我把之前的方法代码改成使用比较操作符: ? 那么就会报错,因为无法约束泛型实现了某些操作符。。。但可以考虑在接口里面实现比较操作符。。。

    1K20

    Kotlin | 9. 泛型

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

    1.8K10

    【数据结构】泛型

    Number本身 7.泛型方法 为什么这里加了static之后就报错了。...7.1通配符 通配符是用来解决泛型无法协变的问题的,协变指的就是如果 Student 是 Person 的子类,那么 List 也应该是 List 的子类。但是泛型是不支持这样的父子类关系的。...泛型 T 是确定的类型,一旦你传了我就定下来了,而通配符则更为灵活或者说是不确定,更多的是用于扩充参数的范围....的基础上又产生了两个子通配符: ? extends 类:设置泛型上限 ? super 类:设置泛型下限 需要注意的是,通配符和函数重载有一定的区别。 7.2通配符上界 语法: 泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

    25510

    Kotlin 泛型详解

    最近一段时间在网上发了一套 Kotlin 的入门视频,涵盖了基础语法、面向对象、高阶函数、DSL、协程等比较有特色的知识点,不过有朋友提出了疑问:这门课为什么不专门讲讲泛型、反射和注解呢?...我最早听到这个问题的时候,反应比较懵逼,因为我居然没有感觉到 Kotlin 的反射、泛型特别是注解有专门学习的必要,因为他们跟 Java 实在是太像了。...当然这么说是从运行时的角度来看的,在编译期,Java 的泛型对于语法的约束也是真实存在的,所以你愿意的话,也可以管 Java 的泛型叫做编译期真·泛型。 那么什么是真·泛型呢?...在 Kotlin 当中有一个关键字叫做 reified,还有一个叫做 inline,后者可以将函数定义为内联函数,前者可以将内联函数的泛型参数当做真实类型使用,我们先来看例子: inline fun...逆变的写法也简单一些: Collection。 那么 Kotlin 是否支持使用点型变呢?当然支持。

    1.2K20

    Kotlin 进阶 泛型知识详解

    前言 详细介绍Kotlin中关于泛型的知识。方便我们理解泛型在Kotlin中的使用。 如果对于泛型知识不太了解,也可以通过本篇文章了解泛型到底是什么,并且对我们开发到底有什么作用。...介绍 什么是泛型?我们如果定义类和接口等,针对传入的数据不确定类型的。统一叫做泛型,通过泛型来实现数据类型的动态化。 使用泛型可以最大限度的重用代码,并且保护数据类型的安全以及提高性能。...我们可以在函数声明,属性声明,类声明和接口声明中使用泛型。下面也从这四个维度进行介绍泛型在Kotlin中的使用。 1.声明泛型函数 例如,我们声明一个比较函数。...我们默认没有定义泛型类型其实就是省略了:Any类型而已。 2. 声明泛型属性 我们在上面的示例中了解了泛型的定义,在函数中的使用。下面我们介绍在类属性中的泛型声明和使用。...3.声明泛型类和接口 其实泛型类和泛型接口这两个都差不多。我们了解接口和类的创建其实本质差不了太多。 而我们声明的泛型类和接口,其实最终还是落实在了类属性和函数中了。

    26730

    From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

    在 Java 中,我们常见的泛型有:泛型类、泛型接口、泛型方法和泛型属性,Kotlin 泛型系统继承了 Java 泛型系统,同时添加了一些强化的地方。...### 泛型接口/类(泛型类型) 定义泛型类型,是在类型名之后、主构造函数之前用尖括号括起的大写字母类型参数指定: ### 声明泛型接口 > Java: ``` //泛型接口 interface...cdn.nlark.com/yuque/0/2023/png/317107/1684995530661-7666a6e4-521c-4378-87f8-09b72ae86c0b.png) 虽然都叫List,也同样支持泛型...普通方式定义的泛型是不变的,简单来说就是不管类型A和类型B是什么关系,Generic与Generic(其中Generic代表泛型类)都**没有任何关系**。...in位置,而函数返回类型叫作out位置 #### 协变 :保留子类型化关系 如果在定义的泛型类和泛型方法的泛型参数前面加上out关键词,说明这个泛型类及泛型方法是协变,简单来说类型A是类型B的子类型

    46950

    kotlin入门之泛型

    【码上开学】Kotlin 的泛型 在学习kotlin 泛型之前我们先来回顾一下关于Java的泛型基础吧。 说道泛型,我们可能最常用的就是在三大集合中去使用。...对于前者,显然我们要添加TextView是不可以的 实际情况是编译器无法确定到底属于那一种。无法继续执行下去,就报错了。 你可能在想那么我为什么使用通配符?呢? 其实,List泛型支持逆变,但是「只能修改不能读取」, 这里说的不能读取是指不能按照泛型类型读取,你如果按照 Object读出来再强转当然也是可以的。...说完了Java的泛型之后,我们在回头看一下kotlin中的泛型。 kotlin 中的out和in kotlin和java泛型一样,kotlin中的泛型本身也是不可变的。...所以该方法的参数是传入不了的 *规则 如果使用在out修饰的类的泛型中使用,那么就会取其上限 如果使用在in修饰的类的泛型中使用,那么就会取其下限Nothing *使用范围 *不能直接或者间接应用在属性或者函数上

    1.2K20
    领券