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

Posted

技术标签:

【中文标题】将类类型作为参数传递并针对 Kotlin 中的另一个对象检查类型【英文标题】:Pass Class Type as Parameter and Check Type Against Another Object in Kotlin 【发布时间】:2018-04-16 15:12:23 【问题描述】:

我正在尝试编写一种方法来等待我的 Espresso 测试出现某种活动。我已经看到了尝试等待对象出现在测试开始之外的单独活动中的示例,但到目前为止没有一个对我有用,而且我不热衷于使用空闲资源修改我的生产代码。

在我的方法中,我想获取当前活动,然后检查该活动是否是我想要的特定类型的类。我基本上是在修改我发现的一些代码 here 以使用 Kotlin 和泛型类类型。不幸的是,我不知道如何格式化传入的参数(当前为Class<out Activity>),或者我在if 语句中使用不当。下面写的内容无法编译。

关于如何将我想要的活动类型作为参数传递给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]

【问题讨论】:

【参考方案1】:

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

if (activityType.isInstance(currentActivity))  ... 

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

【讨论】:

以上是关于将类类型作为参数传递并针对 Kotlin 中的另一个对象检查类型的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript 3:将类作为参数传递

Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

如何将类列表作为参数传递?

如何将类作为方法的参数传递? [复制]

将组件作为“参数”传递给Angular 2中的另一个组件

Kotlin任何作为参数