Kotlin中是可以将内联函数中的泛型进行实化的。

那么具体该怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline

关键字来修饰该函数。其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行

实化。

inline fun <reified T> getGenericType() {
}

getGenericType()函数直接返回了当前指定泛型的实际类型。T.class这样的语法在Java

中是不合法的,而在Kotlin中,借助泛型实化功能就可以使用T::class.java这样的语法了。

inline fun <reified T> getGenericType() = T::class.java
fun main() {
val result1 = getGenericType<String>()
val result2 = getGenericType<Int>()
println("result1 is $result1")
println("result2 is $result2")
}

运行结果:

result1 is class java.lang.String

result2 is class java.lang.Integer

Android中的实际用法:

inline fun <reified T> startActivity(context: Context) {
val intent = Intent(context, T::class.java)
context.startActivity(intent)
} startActivity<TestActivity>(context)

泛型的协变

参数列表是接收数据的地方,因此可以称它为in位置

返回值是输出数据的地方,因此可以称它为out位置



定义了一个MyClass<T>的泛型类,其中A是B的子类型,同时 MyClass<A> 又是 MyClass<B> 的子类型,那么我们就可以称MyClass在T这个泛型上是协变的。

在泛型T的声明前面加上了一个out关键字。这就意味着现在T只能出现在out位置上,而不能出现在in位置上,同时也意味着SimpleData在泛型T上是协变的。

open class Person(val name: String, val age: Int)
class Student(name: String, age: Int) : Person(name, age)
class Teacher(name: String, age: Int) : Person(name, age) class SimpleData<out T>(val data: T?) {
fun get(): T? {
return data
}
} fun main() {
val student = Student("Tom", 19)
val data = SimpleData<Student>(student)
handleMyData(data)
val studentData = data.get()
println(studentData?.name)
println(studentData?.age)
}
fun handleMyData(data: SimpleData<Person>) {
val personData = data.get()
}

泛型的逆变

泛型在协变时只出现在out位置上,逆变时只出现在in位置上,就不会存在类型转换异常的情况

interface Comparable<in T> {
operator fun compareTo(other: T): Int
}

Kotlin泛型的高级特性的更多相关文章

  1. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

  2. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  3. .NET高级特性-Emit(2)类的定义

    在上一篇博文发了一天左右的时间,就收到了博客园许多读者的评论和推荐,非常感谢,我也会及时回复读者的评论.之后我也将继续撰写博文,梳理相关.NET的知识,希望.NET的圈子能越来越大,开发者能了解/深入 ...

  4. java_day06_java高级特性

    Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...

  5. 大数据笔记(二十六)——Scala语言的高级特性

    ===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...

  6. ActiveMQ中的Destination高级特性(一)

    ---------------------------------------------------------------------------------------- Destination ...

  7. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  8. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  9. javascript高级特性

    01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...

  10. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

随机推荐

  1. 读书笔记:CSAPP 11章 网络编程

    深入理解计算机系统 第11章 本章代码:Index of /afs/cs/academic/class/15213-f15/www/code/22-netprog2 其中包含本章课本示例代码,测试 T ...

  2. windows10 使用gcc编译生成可执行文件exe实例解析

    一 操作步骤 1.生成可执行程序 cd xxx # 先进入源程序所在的目录 gcc hello.cpp # 一次性编译,windows系统生成a.exe文件,Linux系统生成a.out文件 gcc ...

  3. yum总纲

    yum总纲 yum源搭建 首先本文档讲解两种搭建方式,第一有网络环境和第二种无网络环境. 第一种:有网络环境 首先 进入系统执行:以下命令,获取网络源 wget -O /etc/yum.repos.d ...

  4. ViewStub你真的了解吗

    目录介绍 01.什么是ViewStub 02.ViewStub构造方法 03.inflate()方法解析 04.WeakReference使用 05.ViewStub为何无大小 06.ViewStub ...

  5. Linux快速入门(七)效率工具(Vim)

    Vim编辑器 所有的Linux系统都会内建一个Vi文本编辑器,而Vim是从Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩展名判别编程语言. 使用方式 ...

  6. uniapp 微信对接地图的三种操作

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.uni.getLocation 获取当前经维度 先上代码 let that = this // 获取用户是否开启 授权获取当前的地理位 ...

  7. HDFS Balancer负载均衡器

    目录 1.背景 2.什么是平衡 2.1 每个DataNode的利用率计算 2.2 集群的利用率 2.3 平衡 3.hdfs balancer语法 4.运行一个简单的balance案例 4.1 设置平衡 ...

  8. ElasticSearch分页查询的实现

    1.设置mapping PUT /t_order { "settings": { "number_of_shards": 1, "number_of_ ...

  9. KingbaseES Json 系列六:Json记录操作函数一

    KingbaseES Json 系列六--Json记录操作函数一(JSONB_TO_RECORD,JSONB_TO_RECORDSET,JSON_TO_RECORD,JSON_TO_RECORDSET ...

  10. 一招搞定进制转换--java篇

    java中进制转化只需要记住这两个方法,后续再遇到进制转换的问题,轻松破解! 进制转换的核心就是: 其他进制--->十进制--->其他进制 1.其他进制转成十进制 valueOf() 方法 ...