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

Kotlin 泛型之类型擦除

Java 泛型的优点包括: 类型安全 消除强制类型转换 避免了不必要的装箱、拆箱操作,提高程序性能 提高代码的重用性 下面,以我的缓存框架 RxCache 中 Memory 接口为例: package...泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,这个过程被称为类型擦除。...因为,Java 数组是协变的,所以 Java 数组不支持泛型。 协变是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语。 四....Kotlin 如何获得声明的泛型类型 跟 Java 一样,Kotlin 也是通过类型擦除支持泛型。 但是 Kotlin 的数组支持泛型,因此它们并不会协变。...的泛型在运行时被擦除了,会带来一些影响。

1.7K30

Kotlin 泛型:类型参数约束

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

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

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

    下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字..., 泛型 T 的实际类型是 String 类型 , 在 logT 中 泛型 R 的类型是 Double 类型 ; student2 实例对象中 , 泛型 T 的实际类型是 Int 类型 , 在 logT...中 泛型 R 的类型是 Boolean 类型 ; 3.14 true 五、泛型类型约束 ---- 在 泛型类 , 泛型函数 中 , 使用泛型前 , 需要声明 泛型参数 : 泛型类 泛型参数 声明 :

    2.9K10

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

    都使用 T 来表示泛型 ; 代码示例 : 下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T..., 泛型 T 的实际类型是 String 类型 , 在 logT 中 泛型 R 的类型是 Double 类型 ; student2 实例对象中 , 泛型 T 的实际类型是 Int 类型 , 在 logT...> 子类 , Producer 的泛型参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer...---- 泛型参数类型 T 在 运行时 会被 类型擦除 , 因此 在运行时 是 不知道 泛型参数 的 具体类型 的 , 借助 reified 关键字 可以检查 运行时 泛型参数 的 具体类型 ;...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    4.1K10

    Kotlin 范型之泛型约束、类型投影、星号投影

    在 Kotlin 中使用:代替 extends 对泛型的的类型上界进行约束。...而使用 in 时,编译可以通过,因为该参数只能出现在方法的入参。 此时,list2 和 list3 分别表示一个受限制的 MutableList。在 Kotlin 中,这种行为被称之为类型投影。...三.星号投影(Star-projections) 星号投影用来表明“不知道关于泛型实参的任何信息”。 类似于 Java 中的无界类型通配符?, Kotlin 使用星号投影*。...四.总结 本文是 Kotlin 范型系列的最后一篇文章。 本文讲述了 Kotlin 泛型约束、类型投影、星号投影的特性。...范型是 Kotlin 的高级特性,相对于 Java 的范型,它拥有更多的概念。 该系列的相关文章: Kotlin 范型之协变、逆变 Kotlin 泛型之类型擦除

    2.7K20

    Kotlin泛型的型变之路

    kotlin修炼指南7之泛型 泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查...reified 由于在Java会进行泛型擦除,所以编译器无法在运行时知道一个确切的泛型类型,也就是说,我们无法在运行时,判断一个对象是否为一个泛型T的实例,例如下面的代码。...public interface List : Collection 获取泛型的具体类型 reified 通过reified和inline配合,我们可以在运行时获取泛型的具体类型,...类型,我们也可以在运行时获取泛型类型,这个方法是Java和Kotlin都支持的,这个在前面的文章中也提到了。...这个方式是一个很巧妙的获取泛型类型的方法,在Gson中,就是通过它来获取类型的。

    1.2K21

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

    ** 因为在Java中,类与类型大部分情况下都是“等价”的(在Java泛型出现前)。事实上,“继承”和“子类型化”是两个**完全不同的概念**。子类型化的核心是**一种类型的替代关系**。...# 泛型:让类型更加安全 Kotlin 的泛型与 Java 一样,都是一种语法糖,即只在源代码中有泛型定义,到了class级别就被**擦除**了。...类型安全:泛型可以在编译时检查类型,从而避免了在运行时出现类型不匹配的错误。这可以提高程序的可靠性和稳定性。 2. 代码重用:泛型可以使代码更加通用和灵活,从而可以减少代码的重复和冗余。...在 Java 中,我们常见的泛型有:泛型类、泛型接口、泛型方法和泛型属性,Kotlin 泛型系统继承了 Java 泛型系统,同时添加了一些强化的地方。...比如,在Java中String是Oject的子类型,但List并不是List的子类型,在Kotlin中泛型的原理也是一样的。

    46950

    【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )

    ("age"); print("泛型测试, 类型整型, 获取的缓存内容为 ${value2}"); } } 打印结果 : I/flutter (24673): 泛型测试, 类型字符串, 获取的缓存内容为...Tom I/flutter (24673): 泛型测试, 类型整型, 获取的缓存内容为 18 二、Dart 泛型中的特定类型约束 ---- 泛型还可以进行特定类型约束 , 如指定该泛型类型必须是某个类的子类...}"); 测试打印结果 : I/flutter (24673): 泛型类测试, 获取的 T extends Person 泛型的 name 字段为 Tom 三、Dart 自带泛型 ---- 在 Flutter..., 在命名构造方法中必须对其进行初始化 // 但是在命名工厂构造方法中 , 可以不初始化 final 类型成员 // 命名工厂构造方法可以有返回值 factory Student.init2...Tom I/flutter (24673): 泛型测试, 类型整型, 获取的缓存内容为 18 I/flutter (24673): 泛型类测试, 获取的 T extends Person 泛型的 name

    5.4K00

    什么是泛型以及在集合中泛型的使用

    大家好,又见面了,我是你们的朋友全栈君。 什么是泛型? 泛型最常与集合使用,因为泛型最开始开始被加入Java就是为了解决集合向下转型一类问题的。...如果我们有这样一个需求:定义一个描述类圆,要求圆中的数据类型是不确定的,也就是声名属性的时候,属性类型是不确定的。比如描述类圆中有半径,要求半径可以用int,也可以用double。...那么此时数据类型不确定,就使用泛型,把数据类型参数化。...集合中泛型的使用 List中使用泛型 在我们创建集合时使用来声明List集合只能保存Dog类对象 List dogs=new ArrayList(); 创建Dog类对象 Dog dog1...Dog类型 总结: 在集合中使用泛型的目的就是为了解决向下转型的问题,在泛型具体化之后,集合只能存储与泛型具体化之后的类型。

    2.1K20

    【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )

    > 子类 , Producer 的泛型参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer...Food 的子类 // 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer 类型 // 在 Java 中这种用法不行...FastFood 是 Food 的子类 // 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer 类型 // 在 Java...---- 泛型参数类型 T 在 运行时 会被 类型擦除 , 因此 在运行时 是 不知道 泛型参数 的 具体类型 的 , 借助 reified 关键字 可以检查 运行时 泛型参数 的 具体类型 ;...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    1.7K10

    如何通过Java反射获取泛型类型信息

    前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能够满足我们日常开发中的大多数场景...泛型的使用场景 在讨论如何用反射获取泛型类型之前,我们先来回顾下,在Java里面什么时候会使用泛型,了解这个问题之后,我们才能继续思考如何用反射获取泛型类型。...; transient Node last; ok,在上面的两种场景中,第一种场景在类和接口上声明的泛型,在运行时反射该类,是没法知道其参数信息的,包括对象本身也不知道它的泛型是什么。...但类似第二种场景中通过对象的指针引用,我们是可以通过反射获取其泛型的类型信息的,但要注意局部变量是没法获取其泛型信息的。...在Java里面可以通过反射获取泛型信息的场景有三个,分别是: (1)成员变量的泛型 (2)方法参数的泛型 (3)方法返回值的泛型 注意,通过对象本身也是没法获取的。

    9.3K21

    如何在运行时(Runtime)获得泛型的真正类型

    前言 由于Java 的类型擦除机制,在编译时泛型都被转为了Object,例如List经过编译之后将变为类型 List。...可以通过以下的方式再运行时获得泛型的真正类型 泛型如何获得具体类型 List 例子如下 来自:https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list...,都是基于 java.lang.reflect.ParameterizedType jackson 中如何反序列化泛型 jackson 中将JSON 转为Map 的可以通过如下代码实现,方式一: ObjectMapper...可以使用方式二,告知实际 Map 中存放的对象,从而得到正确的类型,代码如下所示: ObjectMapper mapper = new ObjectMapper(); String json = "{\...,所以在使用的时候默认就会执行该构造器,上述方案二将会走到分支代码 this.

    2.9K20

    java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」

    本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。...对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。 实例 Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。...泛型抽象类TypeReference用于通过子类获取完整的泛型类型信息。...TypeReference>(){}子类的实例,TypeReference源码部分比较简单,主要逻辑是,通过getClass().getGenericSuperclass()获取父类中的参数化类型(ParameterizedType...Class的genericInfo: 总结Jackson ObjectMapper 提供了TypeReference支持对泛型对象的反序列化; 对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案

    2.7K10
    领券