在编译时检查统一的泛型类型

时间:2019-07-18 10:58:19

标签: generics kotlin reification

我有一个检查其通用类型参数的函数,如果该类型是期望值之一,则使用适合该类型的值进行一些操作。如果类型是意外的,则会引发异常。

inline fun <reified T> convert(functionName: String, vararg args: Any?): T {
    val obj: Any = executeJSFunction(functionName, *args)
    val builtInClasses = arrayOf<KClass<*>>(Int::class, String::class, Boolean::class)

    @Suppress("UNCHECKED_CAST")
    return when {
        T::class in builtInClasses -> 
            obj as T
        T::class.companionObjectInstance as? DataClassFactory<T> != null -> 
            (T::class.companionObjectInstance as DataClassFactory<T>).fromV8Object(obj as V8Object)
        else -> 
            throw IllegalArgumentException("No converter for type ${T::class}")
    }
}

这可行,但是它在运行时进行检查。如果通用类型参数不是预期的类型之一,我想找到一种获取编译错误而不是运行时异常的方法。这可能吗?

0 个答案:

没有答案