ジェネリック型パラメーターをチェックする関数があり、その型が期待される値の 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")