Chronicle Values getter返回整个Array而非单个元素的实现问题
Chronicle Value Interface 整值对象数组读写问题
可运行的下标访问实现
目前已定义支持数组下标访问的getter/setter方法的Value Interface,可正常运行:
interface Instrument: Marshallable { ... fun setBidAt(index: Int, entry: OrderBookEntry) @Array(length = 10) fun getBidAt(index: Int): OrderBookEntry } interface OrderBookEntry: Marshallable{ var level: Int var quantity: Long var price: Double var orders: Long var side: OrderBookSide }
目标写法与运行报错
需要实现可直接操作整个Array的getter与setter方法,形式如下:
interface Instrument: Marshallable { ... fun setBids(entries: kotlin.Array<OrderBookEntry>) @Array(length = 20) fun getBids(): kotlin.Array<OrderBookEntry> }
运行时抛出异常:
java.lang.IllegalStateException: bids field type class [Lme.oms.instrument.OrderBookEntry; is not supported: not a primitive, enum, CharSequence or another value interface
核心疑问
该异常是否代表无法直接通过Chronicle Value Interface实现该需求,必须自定义类实现?查阅ChronicleValues与ChronicleMap的测试用例,未找到该场景的相关测试。
临时解决方案
通过Kotlin扩展函数实现了临时的数组读取逻辑,代码如下:
fun Instrument.getAsks(): kotlin.Array<OrderBookEntry>{ val array = arrayOf<OrderBookEntry>() for (i in (0 until OrderBookMaxSize)) { array[i] = getAskAt(i) } return array }
解答
这个异常是Chronicle Value Interface的原生限制导致的:
- 它的
@Array注解原生支持的字段、返回值类型仅包含基本类型、枚举、CharSequence、其他Value接口,不支持直接返回Value接口类型的数组对象,因此直接定义返回Array<OrderBookEntry>的方法会触发类型校验失败。 - 不需要自定义整个类实现,你目前使用的遍历下标逐个取值组装数组的扩展函数方案,就是该场景下的标准处理方式。对应的批量写入逻辑也可以用相同思路实现:接收数组参数后遍历下标,逐个调用
setBidAt(index, entry)完成赋值即可。 - 官方测试用例中没有相关场景示例,本质是因为整Value类型数组的直接读写不在框架原生支持的能力范围内,所有这类批量操作都需要基于单个下标的get/set方法自行封装。
内容的提问来源于stack exchange,提问作者David Teh
相关产品推荐
相关产品推荐

