zoukankan      html  css  js  c++  java
  • kotlin学习(8)泛型

    泛型的声明

      与Java不同的是,Kotlin要求类型实参要么被显示的说明,要么能被编译器推导出来。因为Java在1.5版本才引入泛型,所以为了兼容过去的版本,可以不直接声明List类型的变量,而不说明类型。

    //下面两种是等价的
    val readers = arrayListOf<String>()
    val readers:ArrayList<String>=arrayListOf()

    泛型函数

    //  第一处是类型形参声明,第二三处分别是接收者和返回类型使用了类型形参
    fun <T> List<T>.slice(indices: IntRange): List<T>{
        val res=arrayListOf<T>()
        indices.forEach{
            res.add(this[it])
        }
        return res
    }
    
    //调用
    >>>val letters=('a'..'z').toList()
    >>>println(letters.slice<Char>(0..2)) //这里显式的指定类型实参
    [a,b,c]
    
    >>>println(letters.slice(1..2)) //这里可以根据letters推导出类型为Char
    [a,b,c]

      泛型属性同理

    泛型类

    //List接口定义了类型参数T
    interface List<T>{   
        //在类或接口的内部,T可以当作普通类型使用
        operator fun get(index: Int): T    
    }
    
    //这个类实现了List,提供了具体类型实参String
    class StringList: List<String>{
        override get(index: Int): String {   //xxxxx   }    
    }    
    
    //现在ArrayList的泛型类型形参T就是List的类型实参
    class ArrayList<T>: List<T>{
        override get(index: Int): T {   //xxxxx   }
    }

    类型参数约束

      “ <T extends Number> ”代表类型形参一定属于Number类型,限制了它的上界。

    让类型形参非空

      " <T : Any> " 代表T的类型一定是非空的,它不接受传入<String?>这样的可空实参。

    不能指定具体类型实参的情况下可以用*

       if ( value is List<*> ){ ... } 这样之判断了value是否为List,而不用在意类型实参具体是什么。

  • 相关阅读:
    网站首页的设计
    短网址服务的构建
    分布式服务框架:Zookeeper
    Hadoop数据传输工具:Sqoop
    规则引擎简介
    HadoopDoctor:来自腾讯数据仓库TDW的MR诊断系统
    Hermes:来自腾讯的实时检索分析平台
    Mdrill:来自阿里的多维快速查询工具
    Saiku操作界面的简化
    Saiku OLAP
  • 原文地址:https://www.cnblogs.com/liumaowu/p/9408077.html
Copyright © 2011-2022 走看看