所以,我有一个值接口这些数组字段getter和setter方法,这是工作的
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
}
然而,我想要一个getter和setter与整个Array
交互,就像:
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
现在,这是否意味着我不能利用时序值接口,必须创建一个自定义类来实现这一点?我试着看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
}
如果您通过values
模块使用接口,则数组的元素也需要为values
,因此它们也可以是flyweight。如果没有这些信息,它就无法确定数组元素的大小。