将 Class 类型作为参数传递并针对 Kotlin 中的另一个对象检查类型

Pass Class Type as Parameter and Check Type Against Another Object in Kotlin

我正在尝试编写一种方法来等待 activity 类型出现在我的 Espresso 测试中。我见过尝试等待对象出现在单独的活动而不是测试开始的地方的例子,但 none 到目前为止对我有用,我不想用空闲资源修改我的生产代码。

在我的方法中,我想获取当前的 activity,然后检查 activity 是否是我想要的 class 的特定类型。我基本上是在修改我发现 here 的一些代码,以便与 Kotlin 和通用 class 类型一起使用。不幸的是,我不知道如何格式化传入的参数(当前 Class<out Activity>)或者我在 if 语句中不正确地使用它。下面写的不编译。

关于如何将我想要的 activity 类型作为参数传递给 waitForActivity 方法以及如何检查它的任何指示?

fun waitForActivity(activityType: Class<out Activity>, timeout: Int = 10): Boolean {
    val endTime = System.currentTimeMillis() + (timeout * 1000)

    do {
        val currentActivity = getActivityInstance()

        // THIS LINE IS MY ISSUE **********************************************
        if(currentActivity != null && currentActivity::class.java is activityType)
            return true
        // ********************************************************************

        SystemClock.sleep(100)
    } while (System.currentTimeMillis() < endTime)
    return false
}

private fun getActivityInstance(): Activity? {
    val activity = arrayOfNulls<Activity>(1)
    InstrumentationRegistry.getInstrumentation().runOnMainSync {
        val currentActivity: Activity?
        val resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
        if (resumedActivities.iterator().hasNext()) {
            currentActivity = resumedActivities.iterator().next() as Activity
            activity[0] = currentActivity
        }
    }
    return activity[0]
}

您可以使用 Class.isInstance 替换整行。

if (activityType.isInstance(currentActivity)) { ... }

在 Kotlin 中,is 需要一个 class 名称(在编译时,您也不能使用 String)——而不是 Class 实例。 Class.isInstance 用于使用 Class 实例执行相同的检查。