前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android面试题之Kotlin泛型和reified关键字

Android面试题之Kotlin泛型和reified关键字

作者头像
AntDream
发布2024-06-13 21:02:06
520
发布2024-06-13 21:02:06
举报
代码语言:javascript
复制
//泛型
class MagicBox<T>(item:T){
    var available = false
    private var subject:T = item

    fun fetch() : T? {
        return subject.takeIf { available }
    }
    //参数是匿名函数,传入T,返回R
    fun <R> fetch(subjectFunction: (T) -> R) : R? {
        return subjectFunction(subject).takeIf { available }
    }
}
class Boy(val name:String, val age:Int)
class Man(val name:String, val age:Int)
class Dog(val weight:Int)

fun main() {
    val box1 = MagicBox(Boy("java", 10))
    val box2 = MagicBox(Dog(10))
    box1.available = true
    box1.fetch()?.run {
        println("you find $name")
    }

    val man = box1.fetch {
        Man(it.name, it.age+10)
    }
    println("${man?.name}, ${man?.age}")
}

泛型in和out关键字

代码语言:javascript
复制
//out
interface Production<out T>{
    fun product(): T
}

//in
interface Consumer<in T>{
    fun consume(item: T)
}

//不变
interface ProductionConsumer<T>{
    fun product():T
    fun consume(item: T)
}

open class Food
open class FastFood: Food()
class Burger : FastFood()

class FoodStore : Production<Food>{
    override fun product(): Food {
        println("Produce food")
        return Food()
    }
}
class FastFoodStore : Production<FastFood>{
    override fun product(): FastFood {
        println("Produce FastFood")
        return FastFood()
    }
}
class BurgerStore : Production<Burger>{
    override fun product(): Burger {
        println("Produce Burger")
        return Burger()
    }
}

class EveryBody: Consumer<Food>{
    override fun consume(item: Food) {
        println("consume food")
    }
}
class ModernPeople: Consumer<FastFood>{
    override fun consume(item: FastFood) {
        println("consume FastFood")
    }
}
class American: Consumer<Burger>{
    override fun consume(item: Burger) {
        println("consume FastFood")
    }
}

fun main() {
    //子类泛型对象可以赋值给父类泛型对象,用out
    val production1: Production<Food> = FoodStore()
    val production2: Production<Food> = FastFoodStore()
    val production3: Production<Food> = BurgerStore()

    //父类泛型对象可以赋值给子类泛型对象,用in
    val consumer1: Consumer<Burger> = EveryBody()
    val consumer2: Consumer<Burger> = ModernPeople()
    val consumer3: Consumer<Burger> = American()
}
reified关键字
  • 和inline一起使用,reified关键字能帮你检查泛型的参数类型。kotlin不允许对泛型参数T做类型检查,因为泛型参数类型会被类型擦除,也就是说T的类型信息在运行时是不可知的
代码语言:javascript
复制
//泛型 //inline和reified关键字一起使用,以便检查泛型参数类型 
class MagicBox2<T: Human>(){
//随机产生一个对象,如果不是指定类型的对象,则通过backup生成指定类型的对象
    inline fun <reified T> randomOrBackup(backup:() -> T): T{
        val items = listOf(
            Boy2("Jav2k",30),
            Man2("John3", 45))
        val random = items.shuffled().first()
        println(random)
        return if (random is T) {
            random
        } else{
            backup()
        }
    }
}

码字不易,求转发,求点在看,求关注,感谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • reified关键字
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档