在字符串模板中使用具体化的 return 类型调用内联函数时,kotlin 类型推断失败

kotlin type inference failed when calling an inline function using reified return type in a string template

我有一个内联函数,它使用如下具体化的输出类型:

class Config {
    inline operator fun <reified T> get(v:String):T = ...
}

我想从字符串模板调用该函数,如下所示:

val c = Config()
val v:String = "value of key is: ${c["key"]}"

当我尝试这样做时,我收到一条编译警告,内容如下:

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.

我知道以下代码有效

val c = Config()
val s:String = c["key"]
val v:String = "value of key is: $s"

但是,如果可能的话,我想告诉 kotlin 在单行中使用的正确类型。

使用强制转换似乎不起作用:

val v:String = "value of key is: ${c["key"] as String}"

我认为在当前版本 (1.2.30) 中唯一可行的是使用 get 方法而不是括号并明确指定类型参数:

val v = "value of key is: ${c.get<String>("key")}"

据我所知,转换应该可以工作(从 Kotlin 1.2 开始,编译器可以从转换中推断出预期的类型),但在这种特定情况下它不起作用,这可能是一个错误,所以您可能想要提交 YouTrack 问题。

(函数内联其实无所谓,问题是它returnsT,而T不依赖于参数类型,所以只能根据类型推断赋值的变量的名称。在字符串模板的情况下,除了明确指定 T 之外,无法提供此信息。)