Kotlin中reified类型与Any类型的区别及适用场景问询
Kotlin中reified类型与Any的区别及适用场景
核心本质区别
- Any:Kotlin所有非空类型的父类,是个实实在在的类型。用它接收对象会丢失具体类型信息,只能事后通过类型判断找回。
- reified:不是类型,是泛型函数的修饰符,专门解决泛型类型擦除问题——让泛型参数在运行时能保留类型信息,不用额外传
Class<T>就能直接用T::class操作。
什么时候用Any?
- 需要兼容任意非空对象时:比如函数参数要接收多种类型的输入,或者临时存储不同类型的元素(但尽量优先用泛型集合,除非确实需要混合类型)
fun showContent(content: Any) { println("内容:$content,类型:${content::class.simpleName}") } showContent("Kotlin") // 输出 内容:Kotlin,类型:String showContent(42) // 输出 内容:42,类型:Int - 处理未知类型对象时:比如反射调用、JSON解析后拿到的对象,先以Any接收,再通过
is判断做针对性处理fun handleObject(obj: Any) { when(obj) { is String -> println("字符串长度:${obj.length}") is List<*> -> println("列表元素数量:${obj.size}") else -> println("无法识别的类型") } }
什么时候用reified?
- 泛型函数里要直接用泛型类型做判断/转换时:比如写通用的类型安全转换函数,不用额外传Class参数
inline fun <reified T> safeConvert(obj: Any?): T? { return obj as? T } val num: Int? = safeConvert("123") // 返回null val str: String? = safeConvert("123") // 成功得到"123" - 要基于泛型类型执行类级操作时:比如创建实例、调用静态方法、过滤集合元素
示例1:创建带无参构造的类实例
示例2:过滤集合中指定类型的元素inline fun <reified T : Any> newInstance(): T { return T::class.java.getDeclaredConstructor().newInstance() } data class Book(val title: String = "默认书名") val book = newInstance<Book>() // 创建Book实例inline fun <reified T> List<Any>.pickType(): List<T> { return this.filterIsInstance<T>() } val mixed = listOf("apple", 5, "banana", 7) val fruits = mixed.pickType<String>() // 得到 ["apple", "banana"] - 简化需要传递Class参数的场景:原本要手动传
T::class.java的地方,用reified可以省略,让代码更简洁
内容的提问来源于stack exchange,提问作者mbpatel
相关产品推荐
相关产品推荐

