【2023】Kotlin教程 第二篇 面向对象与函数式编程 第14章 泛型 14.1 泛型函数 14.1.3 泛型约束

【2023】Kotlin教程

在这里插入图片描述

第二篇 面向对象与函数式编程

第14章 泛型

使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Kotlin影响最大是在集合中使用泛型。

14.1 泛型函数

泛型可以应用于函数声明、属性声明、泛型类和泛型接口。

14.1.3 泛型约束

在之前我们声明的fun <T> isEquals(a:T,b:T):Boolean函数事实上还有一点问题,

在这里插入图片描述

这是因为并不是所有的类型参数T都具有“可比性”,必须限定T的类型,如果只是数字类型比较可以限定为Number,因为lnt和Double等数字类型都继承Number,是Number的子类型。

声明类型参数时在T后面添加冒号(:)和限定类型,这种表示方式称为“泛型约束”,泛型约束主要应用于泛型函数和泛型类的声明。

举个栗子:

package com.dingjiaxiong

private fun <T : Number> isEquals(a: T, b: T): Boolean {
    
    
    return (a == b)
}

fun main() {
    
    

    println(isEquals(1, 5))
    println(isEquals(1.0, 1.0))
}

在这里插入图片描述

这个时候如果再试图比较字符串

在这里插入图片描述

就不行了

其中<T: Number>:是带有约束的类型参数。

这个isEquals函数只能比较Number类型的参数,不能比较String等其他数据类型,为此也可以将类型参数限定为Comparable<T>接口类型,所有可比较的对象都实现Comparable<T>接口,Comparable<T>本身也是泛型类型。

package com.dingjiaxiong

import java.util.Date

fun <T : Comparable<T>> isEquals(a: T, b: T): Boolean {
    
    
    return (a == b)
}

fun main() {
    
    

    println(isEquals(1, 5))
    println(isEquals(1.0, 1.0))

    println(isEquals("a", "a"))

    val d1 = Date()
    val d2 = Date()
    println(isEquals(d1, d2))
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44226181/article/details/130038054