Generics 在Kotlin中获取运行时的泛型类型
我怎样才能做好呢 因为这不起作用。 我有一个Generics 在Kotlin中获取运行时的泛型类型,generics,kotlin,types,Generics,Kotlin,Types,我怎样才能做好呢 因为这不起作用。 我有一个null结果总是class SomeClass() 当我尝试执行SomeClass或类似操作时,我得到一个空值,因为我不知道如何正确获取泛型的类型 我已经尝试在类中创建字段,但我希望避免在此类中创建字段 @Suppress("UNCHECKED_CAST") fun <T : Any> SomeClass<T>.defaultSerializer(): KSerializer<T>? = when (this
null
结果总是class SomeClass()
当我尝试执行SomeClass
或类似操作时,我得到一个空值,因为我不知道如何正确获取泛型的类型
我已经尝试在类中创建字段,但我希望避免在此类中创建字段
@Suppress("UNCHECKED_CAST")
fun <T : Any> SomeClass<T>.defaultSerializer(): KSerializer<T>? = when (this) {
String::class -> StringSerializer
Char::class -> CharSerializer
Double::class -> DoubleSerializer
Float::class -> FloatSerializer
Long::class -> LongSerializer
Int::class -> IntSerializer
Short::class -> ShortSerializer
Byte::class -> ByteSerializer
Boolean::class -> BooleanSerializer
Unit::class -> UnitSerializer
else -> null
} as KSerializer<T>?
@Suppress(“未选中的\u CAST”)
有趣的SomeClass.defaultSerializer():KSerializer?=什么时候(这个){
String::class->StringSerializer
Char::class->CharSerializer
Double::class->DoubleSerializer
Float::class->FloatSerializer
Long::class->longeserializer
Int::class->IntSerializer
Short::class->ShortSerializer
字节::类->字节序列化程序
布尔::类->布尔序列化程序
Unit::class->UnitSerializer
else->null
}作为K系列化者?
您可以使用。因此,您基本上在正确的轨道上,但是您的when语句正在检查this
(在您的代码中,它是SomeClass
的一个实例,与String::class
,Char::class
等进行比较。相反,您需要比较类本身
我建议使用一个内部方法来打开KClass
,然后使用一个公共内联具体化函数,为内部方法提供KClass
。例如:
@PublishedApi
internal fun <T : Any> SomeClass<T>.defaultSerializer(
clazz: KClass<T>
): KSerializer<T>? = when (clazz) {
String::class -> StringSerializer()
Char::class -> CharSerializer()
Double::class -> DoubleSerializer()
Float::class -> FloatSerializer()
Long::class -> LongSerializer()
Int::class -> IntSerializer()
Short::class -> ShortSerializer()
Byte::class -> ByteSerializer()
Boolean::class -> BooleanSerializer()
Unit::class -> UnitSerializer()
else -> null
} as KSerializer<T>?
inline fun <reified T: Any> SomeClass<T>.defaultSerializer(): KSerializer<T>? =
defaultSerializer(T::class)
@PublishedApi
内部类.defaultSerializer(
clazz:KClass
):k序列化器?=何时(clazz){
String::class->StringSerializer()
Char::class->CharSerializer()
Double::class->DoubleSerializer()
Float::class->FloatSerializer()
Long::class->longerializer()
Int::class->IntSerializer()
Short::class->ShortSerializer()
Byte::class->ByteSerializer()
布尔::类->布尔序列化程序()
Unit::class->UnitSerializer()
else->null
}作为K系列化者?
内联类。defaultSerializer():KSerializer?=
defaultSerializer(T::类)
然后,给定SomeClass
的一个实例,您可以执行以下操作:
someClassString.defaultSerializer()
将内部函数和公共函数分开的原因是,当
块被使用时,避免将完整的内联在一起。您能为您的问题添加一个吗?最好是在