乐趣区

关于android:Kotlin-泛型上

一、前言

<font face= 黑体 > 在 Kotlin 汇合的变换与聚合 中咱们曾经将 Kotlin 的 汇合变换与聚合 讲完了,咱们都晓得汇合源码中用到了很多泛型的常识,所以咱们明天咱们来讲 Kotlin 的 泛型

二、泛型

2.1、泛型的基本概念

  • <font face= 黑体 > 泛型是一种类型层面的形象;
  • <font face= 黑体 > 泛型通过泛型参数实现结构更加通用的类型的能力。

<font face= 黑体 > 比拟两个整型的大小 Kotlin 代码能够这样写:

val max = maxOf(1, 2)

<font face= 黑体 >maxOf() 的办法是这样的:

inline fun maxOf(a: Int, b: Int): Int

<font face= 黑体 > 然而呢,下面的 maxOf() 办法只能比拟两个整型的大小,如果咱们要比拟任意类型 (比方 Double 等) 大小的办法要怎么办呢?所以泛型就是用来实现这种需要的,如下:

inline fun<T> maxOf(a: T, b: T): T

2.2、泛型的根本申明办法

  1. <font face= 黑体 > 函数申明泛型:

    fun<T> maxOf(a: T, b: T): T
  2. <font face= 黑体 > 类申明泛型:

    sealed calss List<T>

<font face= 黑体 > 这下面的 T 是 形参 ,当咱们要应用的应用的时候,须要传进去一个 实参,如下:

val max: String = maxOf<String>("Hello", "World")

// 通过类型推到,下面的代码能够简写成这样
val max = maxOf("Hello", "World")

2.3、泛型的束缚

<font face= 黑体 > 当一个泛型参数没有任何束缚时,它能够进行的操作和运算是十分无限的,因为不能对实参做任何类型上的保障,这时候就须要用到泛型的束缚。泛型的束缚是指泛型的实参必须满足肯定的标准,编译器在编译的过程中能够依据束缚来查看所有泛型类型的实参并确保其满足约束条件。

<font face= 黑体 > 下面咱们讲了一个比拟任意类型大小的函数,如下:

fun<T> maxOf(a: T, b: T): T {
    // 编译报错
    return if(a > b) a else b
}

<font face= 黑体 > 显然,下面的代码会报错,a 和 b 都是泛型,不能够用 > 号,这时候,咱们能够给泛型 T 加一个 Comparable 束缚,就能够实现 a > b,这时候 T 须要实现 Comparable 接口,代码如下所示:

fun<T : Comparable<T>> maxOf(a: T, b: T): T {return if(a > b) a else b
}

// String 曾经实现类 Comparable 接口,所以能够间接用
val max = maxOf("Hello", "World")

2.4、泛型的多个束缚

<font face= 黑体 > 在咱们理论开发中,有时会遇到一个泛型有多个约束条件的状况,比方两个数据既要比拟大小,还要执行大的数据类型的 invoke 办法,这时咱们就能够应用 Kotlin 为咱们提供的 where 关键字来进行多个条件的束缚,具体代码如下:

fun <T> callMax(a: T, b: T)
where T : Comparable<T>, T : () -> Unit {if (a > b) a() else b()
}

2.5、多个泛型参数

<font face= 黑体 > 咱们有这样一个需要:比拟两个 T 类型的数据大小,并调用大 T 的 invoke 办法,并返回一个 R 类型的数据,这时就要应用多个泛型参数了,代码如下:

fun <T, R> callMax(a: T, b: T): R
where T : Comparable<T>, T : () -> R, R : Number {return if (a > b) a() else b()
}

<font face= 黑体 > 多个泛型参数的例子咱们平时用的最多的就是 Map<K, V>。

2.6、Java 的泛型束缚

<font face= 黑体 > 泛型束缚的概念 Java 也有,写法是 T extends … 咱们来看一下:

public static <T extends Comparable<T>> T maxOf(T a, T b) {if (a.compareTo(b) > 0) 
        return a;
    else 
        return b;
}

三、源码

源码 已上传至 github,有须要能够间接下载。

退出移动版