isSuperclassOf 与is 与 ==的区别

|---------|------------------|------------------------------|------------------------------------------------------------|
| | is | == | isSuperclassOf(other: KClass<*>) |
| 作用对象 | 实例 vs 类型 | KClass 对象 | KClass 对象 |
| 语法: | obj is Type | A::class == B::class | Parent::class.isSuperclassOf(Child::class) |
| 作用 | 判断一个对象是否是某个类型 | 判断两个 是否完全一样(精确匹配)(不继承) | 判断一个类是否是另一个类的父类/父接口(支持继承) 判断 Parent 是否是 Child 的父类/父接口。 |
| 是否支持继承 | ✅ 支持(多态) | ❌ 不支持 | ✅ 支持 继承/实现关系 |
| | | | |

is

is:判断一个实例对象是否是某个类型

语法:

Kotlin 复制代码
obj is Type
  • 判断 obj 对象实例 是否是 Type 类型(或其子类/实现类)。

  • 是 Kotlin 的关键字,用于运行时类型检查。

  • 支持多态(继承/实现)

  • is 是最常用的类型判断方式,适用于变量或参数的类型检查

为什么不能用 List::class is T::class

List::class is T::class

语法错误

is 是用于 对象实例的类型检查 ,而不是用于比较两个 KClass 对象。

Kotlin 复制代码
List::class is T::class // ❌ 编译错误!
  • List::classT::class 都是 KClass<*> 类型的对象(元数据),不是普通对象实例。
  • is 关键字只能用于实例与类型之间的关系判断 ,不能用于两个 KClass 之间比较继承关系。
  • 所以这行代码根本无法通过编译
Kotlin 复制代码
val x: Any = "hello"
if (x is String) { ... } // ✅ 正确: x 是一个实例,检查它是否是 String 类型

​

 val list: List<String> = ArrayList<String>()
  println(list is List<*>)      // ✅ 正确:  list 实例 是 List 类型

 
​
Kotlin 复制代码
  val list: List<String> = ArrayList<String>()
        println(list is List<*>)      // true → list 实例 是 List 类型
        
        println(list is ArrayList<*>) // true → list 是 ArrayList 类型
        println(list is MutableList<*>)  // true → list 是 MutableList 类型
        // println(list is String)       // false → list 不是 String 类型


        val x: Any = "hello"
        println(x is String)// ✅ 正确:x 是一个实例,检查它是否是 String 类型

==

语法:

Kotlin 复制代码
A::class == B::class
  • 判断两个类 是否完全一样(精确匹配)(不继承)。
  • 不关心继承关系,只看是不是"同一个东西"。
  • == 不能用来判断"是否属于某个类型体系",只能判断"是不是同一个类/类型"。
Kotlin 复制代码
  println(List::class == List::class)           // true → 同一个接口
        println(List::class == ArrayList::class)      // false → List ≠ ArrayList
        println(ArrayList::class == ArrayList::class) // true → 同一个类


        val obj: List<Int> = ArrayList<Int>()

       // 错误想法:想判断 obj 的类型是不是 List
        println(obj::class == List::class)     // false!因为 obj::class 是 ArrayList
        println(obj::class == ArrayList::class) // true

isSuperclassOf(other: KClass<*>)

语法:

Kotlin 复制代码
Parent::class.isSuperclassOf(Child::class)
  • 判断 Parent 是否是 Child 的父类/父接口。
  • 用于类元数据(KClass)之间的继承关系判断
  • isSuperclassOf全面准确,因为它支持继承。
  • inline 函数中判断泛型 T 是否属于某类体系
Kotlin 复制代码
   println(List::class.isSuperclassOf(ArrayList::class))   // true ✅  ArrayList 是 List 的实现
        println(List::class.isSuperclassOf(MutableList::class)) // true ✅  MutableList 是 List 的子接口
        println(ArrayList::class.isSuperclassOf(List::class))   // false ❌
        println(String::class.isSuperclassOf(Int::class))       // false ❌

List::class.isSuperclassOf(T::class)

判断T 是否是 List 的子类或实现类

换句话说:T 是不是一种列表类型?比如 ArrayListMutableListMyCustomList 等。

isSuperclassOf 与 ==结合使用

Kotlin 复制代码
/*
*  判断T是什么类型
* 判断传入的参数value   是类型T
*
*
* T 是什么,value 就必须是什么   如果 T 是 List 子类,则 value 必然是 List 实例
* 所以 value.size 安全可用,无需 is List<*> 判断
* */

inline fun <reified T> checkAllType(value: T)  {
    println("类型T=${T::class.simpleName}   ")

    when  {
        T::class == String::class -> println("传入的参数$value ,是一个String类型 ")  // T 是 String,value 也必须是 String 类型
        T::class == Int::class -> println("传入的参数$value ,是一个Int类型 ")    //T 是 Int,value 也必须是 Int 类型
        T::class == User::class ->println("传入的参数$value ,是一个Use类型 ")
        //  在 inline 函数中判断 泛型 T 是否属于 List 的子类/实现类(推荐)
        List::class.isSuperclassOf(T::class)->{
              // 判断传入的参数value :T 必然是 List<*> 类型的实例 所以 value is List<*> 一定为 true
            if(value is List<*>){
                println("传入的参数$value  ,是一个List类型,大小为: ${(value as List<*>).size}")
            }else{
                println("类型是 List,但实际值不是 List 实例: $value")
            }
        }


        else -> println("未知类型: ${T::class.simpleName}")


    }
Kotlin 复制代码
  val myList:List<Int> =listOf(1,2)
          checkAllType<List<Int>>(myList)    // 传入的参数[1, 2]  ,是一个List类型,大小为: 2

         val myList2: MutableList<String> = mutableListOf("1","2")
        checkAllType<MutableList<String>>(myList2) //传入的参数[1, 2]  ,是一个List类型,大小为: 2

         checkAllType<String>("hello")   //传入的参数hello ,是一个String类型


        checkAllType<Int>(123) //传入的参数123 ,是一个Int类型


         val user = User("Alice", 30)

        checkAllType<User>(user) //传入的参数User(name=Alice, age=30) ,是一个Use类型
相关推荐
雨白2 小时前
Kotlin 泛型进阶:攻克型变与实化,直击痛点
kotlin
alexhilton6 小时前
架构测试为何需要双视图
android·kotlin·android jetpack
事圆则缓6 小时前
Jetpack Compose 快速上手
android·kotlin
事圆则缓7 小时前
MVC、MVP、MVVM、MVI 的区别与实现原理
android·kotlin·mvc
事圆则缓7 小时前
Android组件化指南
android·kotlin
事圆则缓9 小时前
Jetpack Compose Effect 完全指南
android·kotlin
我命由我123451 天前
Android Jetpack Compose 开发问题:Unresolved reference ‘Icons‘.
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime
坚果的博客1 天前
CPF-KMP-CMP:在鸿蒙上用 Kotlin 写跨平台应用
华为·kotlin·harmonyos
事圆则缓1 天前
Kotlin 高阶工程化与 Android 深入实践
android·开发语言·kotlin
pengyu2 天前
【Kotlin 协程修仙录 · 渡劫境 · 中阶】 | 造化神兵:自定义 CoroutineDispatcher 与调度器的终极定制
android·kotlin