第十五節 泛型

weixin_34249678發表於2018-05-25

1、

fun main(args: Array<String>) {

    //使用箱子
    val box=Box<String>("張三")
    println(box.thing)
    val box2=Box<Int>(10)
    println(box2.thing)

}

//箱子
open class Box<T>(var thing:T)

2、


fun main(args: Array<String>) {

   var fruitBox:FruitBox=FruitBox(Apple())
    fruitBox.thing.sayHello()

    var fruitBox1:FruitBox=FruitBox(Orange())
    fruitBox1.thing.sayHello()

}

//箱子
open class Box<T>(var thing:T)

//定義一個水果箱子
 class FruitBox(value:Fruit):Box<Fruit>(value)


abstract class Fruit
{
    abstract fun sayHello()

}

class Apple:Fruit() {
    override fun sayHello() {
        println("蘋果")
    }
}


class Orange:Fruit() {
    override fun sayHello() {
        println("橘子")
    }
}

輸出:


2607504-69de0b9e1de07122.png
image.png
2607504-6a4ac0d298523bcf.png
image.png

3、泛型函式


fun main(args: Array<String>) {
    
    parseType("hello")
    parseType(10)
}

//泛型函式
fun<T> parseType(type:T)
{
    when(type){
        is Int-> println("整形")
        is String-> println("字串")
        else-> println("不知道型別")
    }
}

輸出:


2607504-f330c81d5f48e99a.png
image.png

4、型別擦除

fun main(args: Array<String>) {

    var box1=Box<String>("張三")
    var box2=Box<Int>(10)

    //class型別
    var clz1=box1.javaClass.name
    var clz2=box2.javaClass.name

    println(clz1)
    println(clz2)

}

class  Box<T> (var value:T)

輸出:


2607504-b03dc9a14d619691.png
image.png

可以看到兩個值是相同的
5、獲取泛型型別

fun main(args: Array<String>) {

    pareType(10)
    pareType("張三")
}

//泛型前面加入reified關鍵字,方法前面加上inline關鍵字,就可以在下面獲取泛型型別了
inline fun <reified T> pareType(args:T)
{
    val name=T::class.java.name
    println(name)
}

輸出:


2607504-e5be3935e6a1aecc.png
image.png

6、泛型型別投射
out關鍵字(類似於java中的? extends)

fun main(args: Array<String>) {


    //可以傳遞Person類以及Person類的子類
    var list=ArrayList<Person>()
    setList(list)
    var list2=ArrayList<Student>()
    setList(list2)

}

fun  setList(list:ArrayList<out Person>)
{
    println(list.size)
}

open class Person

open class Student:Person()

in關鍵字(類似於java中的? super)

fun main(args: Array<String>) {


    //可以傳遞Student類以及Student類的父類
    var list=ArrayList<Person>()
    setList(list)
    var list2=ArrayList<Student>()
    setList(list2)
    var list3=ArrayList<Animal>()
    setList(list3)

}

fun  setList(list:ArrayList<in Student>)
{
    println(list.size)
}

open class Animal

open class Person:Animal()

open class Student:Person()

7、星號投射
類似於java中的問號(?)

fun main(args: Array<String>) {
    //*可以傳遞任何型別
    var list=ArrayList<Person>()
    setList(list)
    var list2=ArrayList<Student>()
    setList(list2)
    var list3=ArrayList<Animal>()
    setList(list3)
    var list4=ArrayList<String>()
    setList(list4)
    var list5=ArrayList<Int>()
    setList(list5)


}

fun  setList(list:ArrayList<*>)
{
    println(list.size)
}

open class Animal

open class Person:Animal()

open class Student:Person()

相關文章