【问题标题】:How to make a function that returns a generic object?如何制作一个返回通用对象的函数?
【发布时间】:2021-06-11 09:17:48
【问题描述】:

我正在尝试创建一个返回 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)
}

这是我一开始尝试的,但我遇到了错误。 我应该如何正确地实现这个功能?

【问题讨论】:

  • &lt;T&gt;Any 不是一回事。你到底想达到什么目的?
  • 我尝试返回一个通用对象,我可以将其转换为我需要的任何对象。
  • 我从这个 json 中获取一个对象,将其转换为正确的对象并正常返回。但是我做了很多次看起来如此相似的相同功能,所以我想知道我是否可以做一些更通用的东西?如果这有意义

标签: android function kotlin generics


【解决方案1】:

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

@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 上)并且它已经存在了很长时间,所以我猜它不会改变。

【讨论】:

  • 与此同时,我注意到我可能在原始答案中错过了.javaType。我编辑了它,但请确认您是否需要添加它,所以答案将是正确的(供未来的读者使用)。 @Meyben
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2017-12-05
  • 1970-01-01
  • 2019-10-13
  • 2012-07-17
  • 2012-06-21
相关资源
最近更新 更多