首页 > 解决方案 > 如何制作一个返回通用对象的函数?

问题描述

我正在尝试创建一个返回 T/Any 对象的函数。唯一的问题是我不太确定该怎么做。

 fun readMockData(context: Context, filename: String): Any {
    val json = context.assets.open("$filename.json").bufferedReader().use(BufferedReader::readText)
    return RetrofitSingleton.GSON.fromJson(json, object : TypeToken<Any>() {}.type)
}

这是我最初尝试的方法,但出现错误。我应该如何正确执行此功能?

标签: androidfunctionkotlingenerics

解决方案


如果我正确理解您的问题,这就是您所需要的:

@OptIn(ExperimentalStdlibApi::class)
inline fun <reified T> readMockData(context: Context, filename: String): T {
    val json = context.assets.open("$filename.json").bufferedReader().use(BufferedReader::readText)
    return RetrofitSingleton.GSON.fromJson(json, typeOf<T>().javaType)
}

请注意,它必须是内联的,否则无法获取类型。如果您的函数比上面的更长,最好将其拆分为内联具体化包装器和接受Type作为参数的主函数。

它使用反射,因此您需要为其添加依赖项。此外,typeOf()它是实验性的,但根据我的经验,它可以正常工作(至少在 JVM 上)并且它已经存在了很长时间,所以我猜它不会改变。


推荐阅读