Kotlin泛型强势分析

简介: 一、什么是泛型 1.泛化的类型或者说是类型的抽象 2.鸭子类型在静态语言中的一种近似实现二、泛型的实现机制 1.何为真泛型?(C#) 2.何为伪泛型?(Java,Kotlin)三、首先来看一下JAVA和Kotlin中的伪泛性 但是如果在C#语言中,他就是真泛型了,它不仅仅存在于编译期,也存在于运行期,它是没有任何问题的。

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

二、泛型的实现机制
1.何为真泛型?(C#)
2.何为伪泛型?(Java,Kotlin)

三、首先来看一下JAVA和Kotlin中的伪泛性
这里写图片描述
但是如果在C#语言中,他就是真泛型了,它不仅仅存在于编译期,也存在于运行期,它是没有任何问题的。

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

package com.test

/**
 * @author:wangdong
 * @description:泛型
 */

/**
 * 为函数声明泛型
 * 定义一个方法,求两个数的最大值
 * 那么这两个数首先得能够比较
 * 参数类型为T,返回值为T
 * <T: Comparable<T>> T类型的上界是可以比较的,<T>是实参
 */
fun <T: Comparable<T>> maxOf(a:T,b:T): T{
    return if (a < b) b else a
}

fun main(args: Array<String>) {
    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<Complex>{
    /**
     * 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<T>(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.Gson
import java.io.File

/**
 * @author:wangdong
 * @description:Java和kotlin的伪范型问题
 * reifile 是让泛型参数具体化
 * reifile为什么需要定义在inline函数中
 * 因为kotlin和Java是伪泛型,编译完之后就没有了T,所以只能通过inline关键字,
 * (接上句)将这段代码植入到调用处,才能知道参数的类型
 */
fun main(args: Array<String>) {
    val person = Person("wangdong",18)
    Gson().toJson(person).let{
        //写的
        File("person.json").writeText(it)
    }

    //读的
    needAPerson(Gson().fromJson<Person>(File("person.json").readText()))
}

/**
 * 定义一个需要person的类
 */
fun needAPerson(person: Person){

}

/**
 * 看一下能不能获取到T
 */
fun <T> testGenerics(){
    //把泛型打印出来,这样是打印不了的,会报错
    //看一下这个T到底有没有
    val t: T? = null
    //println(T::class.simpleName)
}

/**
 * 采用Kotlin的特性关键字inline 将方法中的泛型绑定指向调用者
 * 关键字将代码植入到调用点
 */
inline fun <reified T> testGenerics2(){
    println(T::class.java)
}

/**
 * 给Gson定义一个拓展方法
 * 通过依赖把这段代码植入到调用点
 */
inline fun <reified T> Gson.fromJson(json: String): T = fromJson(json,T::class.java)

/**
 * 定义一个person类
 */
data class Person(val name: String,val age: Int){

}

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

目录
相关文章
|
8月前
|
Kotlin
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
62 0
|
4月前
|
数据采集 JSON 安全
简明指南:使用Kotlin和Fuel库构建JD.com分析
Kotlin是一门基于JVM的静态类型编程语言,以其简洁、高效、安全、跨平台等特点而著称。这门语言不仅适用于Android开发,还可用于服务器端和Web应用程序的开发。Fuel库作为一款轻量级的Kotlin HTTP客户端,提供了一套简洁易用的DSL(领域特定语言),使得发送HTTP请求和处理响应变得异常便捷。除此之外,Fuel还支持协程、异步操作、JSON处理以及文件上传等多种功能,以满足各种网络编程需求。
简明指南:使用Kotlin和Fuel库构建JD.com分析
|
7月前
|
安全 Java 编译器
Kotlin 泛型 VS Java 泛型
Kotlin 泛型 VS Java 泛型
36 0
|
10月前
|
存储 JSON 安全
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了
上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java to Kotlin 第二期。 带来 表达式思维、子类型化、类型系统、泛型。
160 0
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了
|
安全 Java 编译器
Kotlin | 理解泛型使用
泛型,指的是具体的类型泛化,多用在集合中(如`List`、`Map`),编码时使用符号代替,在使用时再确定具体类型。
123 0
|
安全 Java C#
Kotlin 之泛型详解
Kotlin 之泛型详解
|
安全 Java 编译器
重学Kotlin之泛型的逆变和协变
泛型的逆变和协变
233 0
|
存储 Java 编译器
Kotlin | 浅谈 Reified 与泛型 的三两事
背景 在业务中,或者要写某个技术组件时,我们无可避免会经常使用到 泛型 ,从而让代码更具复用性与健壮性。 但相应的,由于Java泛型存在 类型擦除 的实现机制,所以某些情况下就会显得力不从心。而在 Kotlin 中,由于最终也会被编译为java字节码,所以无可避免也存在这上述问题🙂。
176 0
|
存储 安全 Java
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
101 0
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
|
安全 Java 编译器
kotlin泛型
kotlin泛型
127 0