kotlin type inference failed when calling an inline function using reified return type in a string template
我有一个内联函数,该函数使用如下所示的标准化输出类型:
1 2 3 | class Config { inline operator fun <reified T> get(v:String):T = ... } |
我想从字符串模板中调用该函数,如下所示:
1 2 | val c = Config() val v:String ="value of key is: ${c["key"]}" |
尝试此操作时,我收到一条编译警告,内容如下:
1 2 3 | Error:(26, 19) Kotlin: Type inference failed: Not enough information to infer parameter T in inline operator fun <reified T> get(v: String): T Please specify it explicitly. |
我知道以下代码有效
1 2 3 | val c = Config() val s:String = c["key"] val v:String ="value of key is: $s" |
但是,如果可能的话,我想告诉kotlin单线使用的正确类型。
使用强制转换似乎无效:
1 | val v:String ="value of key is: ${c["key"] as String}" |
我认为在当前版本(1.2.30)中唯一有效的方法是使用
1 | val v ="value of key is: ${c.get<String>("key")}" |
据我了解,强制转换应该可以正常工作(从Kotlin 1.2开始,编译器可以从强制转换中推断出预期的类型),但是在这种特定情况下,它无法正常工作,这可能是一个错误,所以您可能要提出YouTrack问题。
(函数实际上是内联的,实际上并不重要。问题在于它返回T,并且T不依赖于参数类型,因此只能根据变量的类型来推断它。在使用字符串模板的情况下,除了显式指定T之外,没有其他方法可以提供此信息。