Kotlin如何选择要调用的泛型重载函数?
我正在尝试编写序列化函数,以便能够序列化Kotlin中的任何向量(=ArrayList),以及扩展具有Kotlin如何选择要调用的泛型重载函数?,kotlin,serialization,Kotlin,Serialization,我正在尝试编写序列化函数,以便能够序列化Kotlin中的任何向量(=ArrayList),以及扩展具有toBinary()函数的serialize类的基元类型和类。 我还有一个自定义的WriteDataStream类(下面的代码)来用正确的格式、endianness等序列化字段 我是Kotlin的新手,但有C++的经验。在C++中,我使用模板和模板特化来轻松地解决这个问题,但是用KoTLIN我已经挣扎了几天,没有成功。 我有一个自定义向量类MyVector,它扩展了ArrayList,并添加了一
toBinary()函数的serialize
类的基元类型和类。
我还有一个自定义的WriteDataStream
类(下面的代码)来用正确的格式、endianness等序列化字段
我是Kotlin的新手,但有C++的经验。在C++中,我使用模板和模板特化来轻松地解决这个问题,但是用KoTLIN我已经挣扎了几天,没有成功。
我有一个自定义向量类MyVector
,它扩展了ArrayList
,并添加了一个最大大小。我想用任何泛型类型T
对它进行序列化,包括像MyVector
这样的内部向量
MyWriteDataStream
包含以下内容:
inline fun <reified T> write(vector: MyVector<T>) {
this.writeSize(vector.size.toULong(), vector.MAX_SIZE)
for (element in vector) {
write<T>(element)
}
}
inline fun <reified T: Serialize> write(value: T) {
writeSerialize(value as Serialize)
}
inline fun <reified T> write(value: T) {
when (T::class) {
UByte::class -> {
writeUInt8(value as UByte)
}
UShort::class -> {
writeUInt16(value as UShort)
}
UInt::class -> {
writeUInt32(value as UInt)
}
ULong::class -> {
writeUInt64(value as ULong)
}
Byte::class -> {
writeInt8(value as Byte)
}
Short::class -> {
writeInt16(value as Short)
}
Int::class -> {
writeInt32(value as Int)
}
Long::class -> {
writeInt64(value as Long)
}
Boolean::class -> {
writeBoolean(value as Boolean)
}
Float::class -> {
writeFloat(value as Float)
}
Double::class -> {
writeDouble(value as Double)
}
else -> {
error("Default serialization:" + T::class.qualifiedName)
}
}
}
<>在C++中,编译器总是使用最适合的函数。
有没有办法克服Kotlin的这一限制?
我尝试过使用和不使用具体化类型,也尝试过非泛型函数:inline-fun-write(value:Serialize)
,但没有成功。唯一有效的方法是在完全通用的内联fun write(value:T)
中为类“instance of”序列化添加一个案例,但这并不是一个好的解决方案
谢谢你
您是Java实现泛型的受害者,更具体地说,是C++
使用所谓的类型扩展来实现泛型,这意味着如果您声明MyType及其组件是对象
对于对象
而言,最好的方法匹配是公共最终无效写入(对象值)
,而不是带有字符串
或在您的情况下是序列化
的方法
@Test
fun writeVectorOfStructure() {
class TestStructure: Serialize() {
override fun toBinary(stream: WriteDataStream) {
stream.writeUInt32(17U)
stream.writeUInt8(3U)
stream.writeDouble(555.555)
}
}
val value = MyVector<TestStructure>(MAX_SIZE, arrayListOf(TestStructure(), TestStructure()))
writeStream.write(value)
val bytes: UByteArray = writeStream.byteArray()
Assert.assertEquals(bytes.size, 28) // = 2 (for size) + 2*(4+1+8) = 28 bytes
}
inline fun <reified T: Serialize> write(value: T)
inline fun <reified T> write(value: T)
class SomeType {
inline fun <reified T: String> write(value: T) {}
inline fun <reified T> write(value: T) {}
inline fun <reified T: Any> write(vector: List<T>) {
for (element in vector) {
write(element)
}
}
}
public final class SomeType {
public final void write(@NotNull String value) {}
public final void write(Object value) {}
public final void write(@NotNull List vector) {
boolean var6;
for(Iterator var4 = vector.iterator(); var4.hasNext(); var6 = false) {
Object element = var4.next();
}
}
}