kotlin - 如何获取类型参数的类名?
问题描述
我有一个基类:
abstract class JSONDeserializationStrategy<T : Any>: DeserializationStrategy<T> {
protected abstract fun parse(json: JsonObject): T
protected abstract fun getSerializationException(): SerializationException
}
然后是派生类
class MyClassParserDeserializationStrategy : JSONDeserializationStrategy<MyClass>() {
override val descriptor: SerialDescriptor
= buildClassSerialDescriptor("MyClass")
override fun getSerializationException(): SerializationException
= throw SerializationException("Invalid JSON received for MyClass.")
我如何将属性descriptor
和方法getSerializationException
从派生类移动到基类中,因为它们只能通过提供它们的名称作为字符串来“适应”?我试图做一些事情,T::class.java.simpleName as String
但没有奏效。做这个的最好方式是什么?
解决方案
正如@Tenfour04 解释的那样,T
它已被删除,因此无法直接访问。但是,只要JSONDeserializationStrategy
提供的子类T
作为特定的类/类型,就可以通过一些反射巫术来获取它:
fun main() {
val strategy = MyClassParserDeserializationStrategy()
println(strategy.descriptor.serialName) // MyClass
}
abstract class JSONDeserializationStrategy<T : Any>: DeserializationStrategy<T> {
protected val type: KType = this::class.supertypes
.first { it.classifier == JSONDeserializationStrategy::class }
.arguments[0].type!!
@Suppress("UNCHECKED_CAST")
protected val typeClass = requireNotNull(type.classifier as? KClass<T>) {
"T is unknown"
}
override val descriptor: SerialDescriptor = buildClassSerialDescriptor(typeClass.simpleName!!)
fun getSerializationException(): SerializationException =
throw SerializationException("Invalid JSON received for ${typeClass.simpleName!!}.")
...
}
我不是 100% 确定,但我相信两者type!!
都是simpleName!!
安全的,它们不能为空。
T
此外,如果真的完全擦除且未知,它将无法工作,例如:
val strategy = GenericParserDeserializationStrategy<MyClass>() // exception
type
出于这个原因,打开/属性进行覆盖是有意义typeClass
的,因此通用的非抽象子类可以提供自己的获取方式T
。但是,我们可能需要将大多数属性的初始化移到构造函数之外。
推荐阅读
- php - 通过带有 PDO 页面的会话变量将登录 ID 传递到另一个页面
- javascript - 包含 promise 调用的函数中的参数范围
- c# - Json 反序列化错误。不支持的类型:System.Guid
- postgresql - 我可以将自己的 UDF 作为内置函数添加到 PostgreSQL 吗?
- c# - ASP.NET MVC - Kendo Grid 缓慢分页
- c++ - 在片段着色器中丢失纹理定义
- ios - 如何使用自己的 pod 创建可可触摸框架
- javascript - 当进行 http 请求/axios 时,Nativescript 卡住并停止
- javascript - 如何测试 forEach 是否调用了 savePost 三次?
- azure - 需要 Azure API 监控的服务建议