You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:18:24