【发布时间】:2020-10-01 12:36:52
【问题描述】:
实际上,主要问题仍然是 Kotlin 中的类没有具体的类型参数。但这就是为什么在这种特定情况下这让我感到困扰:
假设您有一个包装类 Wrapper,它接收一个字符串 content 和一个类* type,并且可以通过调用函数getObj():
class Wrapper<T>(private val content: String, /*private val type: KClass<*>*/) {
fun getObj(): T {
// ?
}
}
我想使用 kotlinx.serialization。现在,您可能已经注意到我之前是如何在“class”后面加上星号的。原因如下:是的,Wrapper 必须以some 的方式获取目标类,但是如何?它应该只是 typearg(因为 type erausre 不起作用)还是 KClass 引用(因为我需要一个 reified typearg 而不起作用)?
据我所知,将通用 JSON 解码为可序列化目标类的唯一方法是使用Json.decodeFromString<T>(content),其中T 是目标类型,content 是 JSON 字符串。现在,T 被定义为具体化(以便可以在运行时处理该类型)并且只能用另一个具体化的类型参数或实际的类引用来填充。我不能使用另一个具体化的类型参数,因为我在一个类的上下文中,一个类不能有具体化的类型参数。我也不能使用实际的类引用,因为类的用户应该能够使用不同的目标来构造它,例如他们决定目标是什么,而不是我。
那么,我该如何使用 kotlinx.serialization 来做到这一点?有没有可能?
【问题讨论】:
-
抱歉,我不明白使用
KClass有什么问题,就像您在构造函数中显示的那样(我认为应该是KClass<T>)。 -
据我所知,kotlinx.serialization 不需要
KClasses,因为它是一个多平台库,而且反射只在JVM上可用,它也可以不使用反射。如果它适用于KClass,我会使用它。因此,如果可能,请纠正我并告诉我该怎么做 -
@user AFAIK 内联类仍然是实验性的(虽然这不是一个大问题),但真正的问题是我想做的不仅仅是一个简单的包装类,当然。问题中的包装类仅显示问题的最简化解释。实际上,除其他外,该类还应该进行一些缓存。我认为很明显,对于缓存,我需要多个字段。因此我不能使用内联类
标签: json kotlin generics kotlinx.serialization kotlin-reified-type-parameters