【发布时间】:2017-05-16 11:37:11
【问题描述】:
考虑一个通过 Java 类推断其类型的 Java 方法,如下所示:
public <T> T readJson(Class<T> c) throws IOException {
这允许做这样的事情:
Map<String, String> map = foo.readJson(Map.class);
在 java 中它会警告未经检查的强制转换,但它会正常工作。但是在 Kotlin 中,这并不容易,可以尝试使用:
foo.readJson(Map::class.java)
但是,如果需要Map<String, String>,它将不起作用:
Type inference failed. Expected type mismatch.
required Map<String, String>
found Map<*, *>!
我也试过定义一个接口StringMap:
interface StringMap : Map<String, String>
但是这也不起作用,它会导致这样的异常:
Cannot cast ...LinkedTreeMap to ...StringMap
这样做的正确方法是什么?
【问题讨论】:
-
请注意,您在此处通过使用 Class 而不是 Type 来使用已擦除类型,大多数 JSON 解析器允许您指定 Type、TypeRef、TypeReference 或类似的而不是 Class,如果出现以下情况,您应该考虑进行更改你的库支持它,否则泛型参数将被忽略。
标签: kotlin