在Kotlin中推断映射的泛型类型
考虑一个通过Java类推断其类型的Java方法,如下所示:在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的原始
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