java从1.5引入泛型,kotlin基于java1.6,主要作用
- 类型检查,编译时检查错误,提供安全保证
- 自动类型转换
一、泛型类
class Box<T>(t : T) { var value = t } fun main(args: Array<String>) { var boxInt = Box<Int>(10) var boxString = Box<String>("Runoob") println(boxInt.value) println(boxString.value) }
二、泛型方法
fun main(args: Array<String>) { val age = 23 val name = "runoob" val bool = true doPrintln(age) // 整型 doPrintln(name) // 字符串 doPrintln(bool) // 布尔型 } fun <T> doPrintln(content: T) { when (content) { is Int -> println("整型数字为 $content") is String -> println("字符串转换为大写:${content.toUpperCase()}") else -> println("T 不是整型,也不是字符串") } }
三、泛型约束
使用泛型约束,对参数类型指定一个允许的类型范围
常见的是约束上限
fun <T : Comparable<T>> sort(list: List<T>) { // …… }
compara 的子类型可以使用
sort(listOf(1, 2, 3))
四、委托
1、类委托
类委托核心思想就是把一个类的具体实现委托给另外一个类,使用 by 关键字进行委托
//定义一个 MySet 类,它里面的具体实现都委托给了 HashSet 这个类,这是是类委托 class MySet<T>(val helperSet: HashSet<T>) : Set<T>{ override val size: Int get() = helperSet.size override fun contains(element: T) = helperSet.contains(element) override fun containsAll(elements: Collection<T>) = helperSet.containsAll(elements) override fun isEmpty() = helperSet.isEmpty() override fun iterator() = helperSet.iterator() } /** * 如果我们使用 by 关键字,上面的代码将会变得非常整洁,同时我们可以对某个方法进行重写或者新增方法 * 那么 MySet 就变成了一个全新的数据结构类 */ class MySet<T>(val helperSet: HashSet<T>) : Set<T> by helperSet{ fun helloWord(){ println("Hello World") } override fun isEmpty() = false }
2、属性委托
属性委托的核心思想是将一个属性的具体实现委托给另一个类去完成