kotlin - 当在字符串模板中使用经过修饰的返回类型调用内联函数时,kotlin类型推断失败

标签 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.2.30)中唯一有效的方法是使用get方法而不是方括号,并明确指定type参数:

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

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

(该函数实际上是内联函数实际上并不重要。问题在于它返回T,并且T不依赖于参数类型,因此只能根据为其分配值的变量的类型来推断它。对于字符串模板,除了显式指定T之外,没有其他方法可以提供此信息。)

关于kotlin - 当在字符串模板中使用经过修饰的返回类型调用内联函数时,kotlin类型推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214667/

相关文章:

android - 将Kotlin下载到Android Studio中时出现与证书相关的错误

android - 将持有 Retrofit 实例的单例

generics - 如果你只有一个 KClass 对象,用 reified 类型参数调用一个 fun 吗?

androidx.lifecycle 或 android.arch.lifecycle

kotlin - Kotlin 函数引用是否有一个简单的空安全运算符?

java - 与Kotlin共享Fragment中的首选项

generics - Kotlin 中的 reified 关键字是如何工作的?

kotlin - 如何递归地实现对 Iterable 的深度扁平化?

android - 如何在 Kotlin 中创建具体化类型的对象