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()

将内部函数和公共函数分开的原因是,当
块被使用时,避免将完整的
内联在一起。

您能为您的问题添加一个吗?最好是在