Kotlin中如何判断对象是否属于指定类型列表?
Kotlin中判断对象是否属于指定类型列表的惯用实现
你想要的e is in listOf(FooException, BarException)这类直接语法在Kotlin里并不支持,因为in运算符的作用是检查对象是否存在于集合中,而集合里的FooException、BarException是类的引用,并非对象实例。下面是几种惯用的实现方式:
1. 直接使用any函数结合KClass.isInstance
这是最直接的写法,通过遍历类型列表,检查对象是否是列表中某类的实例:
// 若需重复使用,可将类型列表提取为变量 val targetExceptionTypes = listOf(FooException::class, BarException::class) if (targetExceptionTypes.any { it.isInstance(e) }) { // 编写你的处理逻辑 }
如果只是单次使用,也可以直接把列表写在判断条件里:
if (listOf(FooException::class, BarException::class).any { it.isInstance(e) }) { // 编写你的处理逻辑 }
2. 封装扩展函数简化调用
如果需要多次进行这类判断,可以给Any类型封装一个扩展函数,让调用更简洁直观:
fun Any?.isInstanceOfAny(vararg classes: KClass<*>): Boolean { // 处理对象为null的情况,直接返回false if (this == null) return false return classes.any { it.isInstance(this) } }
使用时语法接近你最初的设想:
if (e.isInstanceOfAny(FooException::class, BarException::class)) { // 编写你的处理逻辑 }
3. 兼容Java类的写法
如果是处理Java类或者需要使用Class类型而非Kotlin的KClass,可以改用Class.isInstance:
if (listOf(FooException::class.java, BarException::class.java).any { it.isInstance(e) }) { // 编写你的处理逻辑 }
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

