文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Kotlin泛型的使用介绍

2024-04-02 19:55

关注

1.泛型类、泛型函数

1)泛型类可以接收任意类型。Package<T>(t: T)

2)泛型类中定义的泛型参数<T>,通常用T(Type)表示,(t: T) 这个表示泛型类Package的主构造函数可以接收T类型的属性。

3)openPackage(): T定义一个返回T类型的泛型函数。

4)fun <R> getProductName(block: (T) -> R): R getProductName的返回值是R(英文的Return),接收一个匿名函数为参数block: (T) -> R,这个匿名函数的参数是T,返回值是R。也就是说,匿名函数的返回值,就是getProductName的返回值。这个和前面讲到的apply、let、run、with等是一样的多参数函数。

//泛型类
class Package<T>(t: T) {
    private val product: T = t
    //泛型函数
    fun openPackage(): T {
        return product
    }
    //多参数泛型函数
    fun <R> getProductName(block: (T) -> R): R {
        return block(product)
    }
}
fun main() {
    val pkg = Package(Phone("IPhone"))
    println(pkg.openPackage())
    println(pkg.getProductName {
        it.name
    })
    val pkg2 = Package(Fruit("Apple"))
    println(pkg2.openPackage())
    println(pkg2.getProductName {
        it.name
    })
}

2.泛型类型约束。上面的泛型类,可以接收任意类型。如果我们只想某个类接收特定类型的,可以使用泛型约束。

1)定义一个父类Fruit和两个子类,Apple和Banana

open class Fruit(val name:String){
}
class Apple(name:String) : Fruit(name){
}
class Banana(name:String):Fruit(name){
}

2)定义泛型类约束:<T:Fruit> 表示只能接收Fruit类或子类。和Java中的<? extends Fruit>作用是一样的。

Kotlin中定义泛型约束

class Package<T:Fruit>(t: T) {
    private val product: T = t
    fun openPackage(): T {
        return product
    }
    fun <R> getProductName(block: (T) -> R): R {
        return block(product)
    }
}
fun main() {
    //定义了泛型约束的类,只能放Fruit的子类
    val pkg = Package(Apple("apple"))
    val pkg2 = Package(Banana("banana"))
    //Phone类型是放不进去的
    val pkg3 = Package(Phone("Iphone"))
}

Java中定义泛型约束

public class Package<T extends Fruit> {
    public T t;
    public Package(T t) {
        this.t = t;
    }
    public T openPackage() {
        return t;
    }
}

3.泛型类接收的参数也可以是一个集合:

class Package<T:Fruit>(list:List<T>) {
    var list = list
    fun get(index:Int):Fruit = list[index]
}

vararg items: T 就表示可以存放多个。vararg就是对应java中的可变参数。可以用一个数组来接收它Array<out T> ,这里的out 就是协变的意思。表示,可以就收该类或该类的子类。

class Package<T : Fruit>(vararg items: T) {
    var itmes: Array<out T> = items
   operator fun get(index: Int): Fruit = itmes[index]
}
fun main() {
    val p = Package22(listOf(Apple("apple")))
    println(p.get(0))
    val p2 = Package(Apple("apple"))
    println(p2[0])
}

4.协变out,逆变in

out T 对应java中的 ?extend T

int T 对应java中的?super T

5.类型擦除

对应java和Kotlin,泛型都值存在于编译期,运行后,就不存在泛型的概念,而是指定类型。

如果我们想要检查所传入泛型的类型,在kotlin中可以使用reified 关键字。在Java中可以通过反射的方式,来获取泛型的类型。

到此这篇关于Kotlin泛型的使用介绍的文章就介绍到这了,更多相关Kotlin泛型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯