kotlin - 用 'is'运算符查找类实例的通用方法

标签 kotlin

我是Kotlin开发的新手,并试图在Kotlin中创建一个使用Exception实例和一个类(例如RuntimeException)的函数来检查该实例是否是特定类的实例。想法是您已捕获到特定类型的异常。然后,您要遍历此异常的原因,直到找到了所要查找的特定异常为止。

        fun findExceptionType(currentException : Throwable?, exceptionToFind: KClass<Throwable>): Throwable? {
            var _currentException = currentException
            while((_currentException!!.cause == null)!!) {
                if (_currentException is exceptionToFind) {
                    return _currentException.cause
                }
                _currentException = _currentException.cause
            }
            return null
        }

这个想法是它将继续遍历exception.cause,直到exception.cause为null或找到要搜索的异常类型为止。这似乎已经实施了,所以我很惊讶自己必须自己实施。

使用该实用程序功能的原因是避免遍历所有exception.cause,直到找到所需的特定类型为止。

更加具体:

在Kotlin中,有一个'is'运算符,例如,您可以说if (s is String),但是在我上面的函数中,我想通过像if (s is X)这样的东西将其传递给函数来使其通用。 X的类型是什么?目前,我使用了X,但不确定KClass运算符的类型签名是什么?

最佳答案

我同意@dyukha。在这里使用reified类型参数非常方便。有了它,您可以像下面这样重写函数:

inline fun <reified T : Throwable> findExceptionType(throwable: Throwable?): T? {
    var error = throwable
    while (error !is T) {
        error = error?.cause
    }
    return error
}

作为通用的if (s is X) where X is passed into the function,您可以使用以下代码:
(x as? String)?.let { println(it) }

关于kotlin - 用 'is'运算符查找类实例的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433074/

相关文章:

kotlin - Kotlin 中使用接口(interface)和类进行类型检查

android-studio - Android Studio/IntelliJ 中的 `^let` 注释是什么?

java - 使用 Kotlin DSL 构建包含 Gradle 中包含的源代码的 jar?

android - 参数的类型必须是带有 @Entity 注释的类或其集合/数组

function - Kotlin:获取对类实例函数的引用

kotlin - 有人可以解释这个Kotlin表达吗?

android - kapt 不解析 protobuf 生成的类

android - 用kotlin改造,无法创建@Body

android - 如何在Android Studio中无缝循环播放视频

java - Android三元运算符对自定义 View 的自定义颜色属性