博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin泛型强势分析
阅读量:5911 次
发布时间:2019-06-19

本文共 2877 字,大约阅读时间需要 9 分钟。

一、什么是泛型

1.泛化的类型或者说是类型的抽象
2.鸭子类型在静态语言中的一种近似实现

二、泛型的实现机制

1.何为真泛型?(C#)
2.何为伪泛型?(Java,Kotlin)

三、首先来看一下JAVA和Kotlin中的伪泛性

这里写图片描述
但是如果在C#语言中,他就是真泛型了,它不仅仅存在于编译期,也存在于运行期,它是没有任何问题的。

四、在kotlin中定义泛型类和泛型方法

package com.test/** * @author:wangdong * @description:泛型 *//** * 为函数声明泛型 * 定义一个方法,求两个数的最大值 * 那么这两个数首先得能够比较 * 参数类型为T,返回值为T * 
> T类型的上界是可以比较的,
是实参 */fun
> maxOf(a:T,b:T): T{ return if (a < b) b else a}fun main(args: Array
) { val a = 5 val b = 8 val c = maxOf(a,b) println(c) val complex = Complex(3.0,2.4) val complex2 = Complex(3.0,5.0) println(complex) //比大小 println(maxOf(complex,complex2)) // 输出//complex2的值(3.0 + 5.0 i) //自动推导出double val complex3 = Complex2(5.3,6.9) val complex4 = Complex2(4,55) println(complex3) println(complex4)}/**实现Complex接口,现在指定的是一个Double,实际上给它一个泛型T应该是更好的*/data class Complex(val a:Double, val b: Double): Comparable
{ /** * Compares this object with the specified object for order. Returns zero if this object is equal * to the specified [other] object, a negative number if it's less than [other], or a positive number * if it's greater than [other]. */ override fun compareTo(other: Complex): Int { return (value() - other.value()).toInt() } fun value():Double{ return a*a + b*b } /** * Returns a string representation of the object. */ override fun toString(): String { return "($a + $b i)" }}/**为类声明泛型:参数泛型化*/data class Complex2
(val a:T, val b: T){ /** * Returns a string representation of the object. */ override fun toString(): String { return "($a + $b i)" }}

五、通过kotlin的字节码分析,看看能不能获取到泛型T是什么东西

可以看到编译完,T就变成了Object了,这就是伪泛型
这里写图片描述

六、看一下JAVA和Kotlin中的伪泛型实例

import com.google.gson.Gsonimport java.io.File/** * @author:wangdong * @description:Java和kotlin的伪范型问题 * reifile 是让泛型参数具体化 * reifile为什么需要定义在inline函数中 * 因为kotlin和Java是伪泛型,编译完之后就没有了T,所以只能通过inline关键字, * (接上句)将这段代码植入到调用处,才能知道参数的类型 */fun main(args: Array
) { val person = Person("wangdong",18) Gson().toJson(person).let{ //写的 File("person.json").writeText(it) } //读的 needAPerson(Gson().fromJson
(File("person.json").readText()))}/** * 定义一个需要person的类 */fun needAPerson(person: Person){}/** * 看一下能不能获取到T */fun
testGenerics(){ //把泛型打印出来,这样是打印不了的,会报错 //看一下这个T到底有没有 val t: T? = null //println(T::class.simpleName)}/** * 采用Kotlin的特性关键字inline 将方法中的泛型绑定指向调用者 * 关键字将代码植入到调用点 */inline fun
testGenerics2(){ println(T::class.java)}/** * 给Gson定义一个拓展方法 * 通过依赖把这段代码植入到调用点 */inline fun
Gson.fromJson(json: String): T = fromJson(json,T::class.java)/** * 定义一个person类 */data class Person(val name: String,val age: Int){
}

七、好了,泛型到这里就结束啦。

你可能感兴趣的文章
使用Maven运行 MyBatis Generator
查看>>
7-设计模式-代理模式
查看>>
RedHat已更改其开源许可规则
查看>>
Android零基础入门第29节:善用TableLayout表格布局,事半功倍
查看>>
element-ui 的 table后端排序
查看>>
redis集群搭建
查看>>
linux重定向
查看>>
红包生成的模拟器2018今日头条秋招
查看>>
管道符和作业控制,shell变量和环境变量配置文件
查看>>
DirectX3D设备丢失(lost device)的处理(一)
查看>>
来自田野的回音——《背过身去的大娘娘》的读后感范文2600字
查看>>
LNMP架构 (Ⅱ)——nginx相关配置、nginx代理
查看>>
神级python程序员只需要一个公众号,再也不会错过重要资讯
查看>>
双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
查看>>
OSChina 周一乱弹 ——程序员跟产品经理撕逼必须掌握的套路
查看>>
Linux系统启动流程详解
查看>>
我的友情链接
查看>>
Magento(CE1.X)自带模块解析五
查看>>
Factory Method模式 (一)
查看>>
java正则表达式的学习
查看>>