3

ジェネリック型パラメーターをチェックする関数があり、その型が期待される値の 1 つである場合は、その型に適した処理を行います。型が予期しないものである場合、例外がスローされます。

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}")
    }
}

これは機能しますが、実行時にチェックを行っています。ジェネリック型パラメーターが期待される型の 1 つでない場合、実行時例外ではなく、コンパイル エラーを取得する方法を見つけたいと思います。おそらく契約で、これは可能ですか?

// should compile, as Int is one of the supported types
val intResult: Int = convert("intFunction")         

// should fail to compile, as Double is unsupported
val doubleResult: Double = convert("doubleFunction")
4

1 に答える 1