在字符串模板中使用reified返回类型调用内联函数时,kotlin类型推断失败

时间:2018-03-10 22:30:47

标签: kotlin kotlin-reified-type-parameters

我有一个内联函数,它使用如下所示的已知输出类型:

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 个答案:

答案 0 :(得分:1)

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

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

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

(函数内联实际上并不重要。问题是它返回T,并且T不依赖于参数类型,因此只能根据变量的类型来推断它哪个值被赋值。对于字符串模板,除了明确指定T之外,没有办法提供此信息。)