Я ищу способ в Котлине обойти дженерики - но они будут иметь фиксированные типы к моменту компиляции.
Моя цель заключается в создании базового класса Field<T>
, который будет иметь открытое свойство типа T, которое поддерживается полем ByteArray.
ByteArray будет преобразован во время выполнения в и из T с использованием глобального хранилища преобразователей. Однако я не могу обернуть голову вокруг стирания типа Kotlin, чего я не встречал в C # (почти такой же код работал бы чудесно).
Итак, моей общей целью будет этот класс (обратите внимание, это в основном псевдокод!):
class Field<T> {
private var actualData: ByteArray = TODO("Init here")
public var Data: T =
get() = getConverter().convert(actualData)
set(value) {
val converted = getConverter().convertBack(value)
// Do some other nasty stuff here
actualData = converted
}
private fun getConverter(): Converter<T> = TODO("This needs implementation")
}
Поскольку шаги преобразования всегда одинаковы, было бы здорово, если бы я мог динамически захватывать конвертер и не нуждался в создании наследующего класса каждый раз, то есть я мог бы определять поля, которые «просто работают»:
var data1: Field<Int> = TODO("Init here")
var data2: Field<MyOjbect> = TODO("Init here")
И, конечно же, я бы хотел избежать реализации getConverter()
для каждого типа.
Есть ли способ заставить это работать в Kotlin, или я должен придерживаться Java в этой части?
(П.С .: Я, очевидно, не назову свой класс Field<T>
, но это имя, похоже, было наиболее общим для описания его роли в этом сценарии).