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

时间:2019-08-09 15:23:45

标签: 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为空,或者您找到了要搜索的异常类型。这似乎已经实施了,所以我很惊讶自己必须自己实施。

使用该实用程序功能的原因是避免在找到所需的特定类型之前不必遍历所有exception.cause

更具体地说:

在Kotlin中有一个'is'运算符,例如您可以说if (s is String),但是在我上面的函数中,我想通过使用类似if (s is X)的{​​{1}}使其通用。传递给函数。 X的类型是什么?目前,我已经使用过X,但不确定KClass运算符的类型签名是什么?

1 个答案:

答案 0 :(得分:3)

我同意@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) }