Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin中推断映射的泛型类型_Kotlin - Fatal编程技术网

在Kotlin中推断映射的泛型类型

在Kotlin中推断映射的泛型类型,kotlin,Kotlin,考虑一个通过Java类推断其类型的Java方法,如下所示: public <T> T readJson(Class<T> c) throws IOException { 但是,如果需要Map,它将不起作用: Type inference failed. Expected type mismatch. required Map<String, String> found Map<*, *>! 正确的做法是什么 Kotlin没有类似于Java的原始

考虑一个通过Java类推断其类型的Java方法,如下所示:

public <T> T readJson(Class<T> c) throws IOException {
但是,如果需要
Map
,它将不起作用:

Type inference failed. Expected type mismatch.
required Map<String, String>
found Map<*, *>!

正确的做法是什么

Kotlin没有类似于Java的原始类型(保留在Java中是为了向后兼容),因此类型系统不允许隐式进行此类未经检查的赋值(,Kotlin中最接近原始类型的概念,保留类型安全性)

您可以对
映射
进行未选中的强制转换,从而表示您在运行时意识到可能存在类型不匹配:

@Suppress("UNCHECKED_CAST")
val result = foo.readJson(Map::class.java) as Map<String, String>


<代码>有趣的PrimeMap(Map:MapNote),这里使用的是一个类,而不是一个类型,大多数JSON解析器允许你指定一个类型,TypeRef,TyePeRead或类似而不是类,如果你的库支持它,你应该考虑做出这样的改变,否则泛型参数被忽略。
Type inference failed. Expected type mismatch.
required Map<String, String>
found Map<*, *>!
interface StringMap : Map<String, String>
Cannot cast ...LinkedTreeMap to ...StringMap
@Suppress("UNCHECKED_CAST")
val result = foo.readJson(Map::class.java) as Map<String, String>
@Suppress("UNCHECKED_CAST")
inline fun <reified T: Any> JsonReader.readJson(): T {
    val result = readJson(T::class.java)
    return result as T
}
val map = jsonReader.readJson<Map<String, String>>()
fun processMap(map: Map<String, String) { /* ... */ }

processMap(jsonReader.readJson()) // Map<String, String> is inferred for this call