首页 > 解决方案 > IllegalArgumentException 初始化编年史地图

问题描述

这是我的一段代码

MyValue sampleValue = Values.newHeapInstance(MyValue.class); 

// subsequently set the couple of floats and int i have defined in MyValue interface

ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
                .entries(100)
                .averageValue(sampleValue)
                .create();

当我这样做时,我得到了错误

java.lang.IllegalArgumentException:使用 BytesMarshallable 和 net.openhft.chronicle.map.ChronicleMapBuilder.averageValue(ChronicleMapBuilder.java:660) 不支持的接口值类型

有人可以帮我理解这种使用模式是否不正确吗?

如果我更改为通过实现一个具体类来创建 MyValue 然后按如下方式对其进行新的操作:

MyValue sampleValue = new MyValueImpl();

// subsequently set the couple of floats and int i have defined in MyValue interface

ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
                .entries(100)
                .averageValue(sampleValue)
                .create();

标签: javachronicle-map

解决方案


使用Values.newHeapInstance()建议MyValue就是所谓的价值接口。特定值接口的对象具有序列化形式的恒定大小。ChronicleMap 特别支持值接口,因此您根本不应该配置值大小,如教程中的示例所示

ChronicleMap<LongValue, Order> orders = ChronicleMap
    .of(LongValue.class, Order.class)
    .name("orders-map")
    .entries(1_000_000)
    .create();

LongValue key = Values.newHeapInstance(LongValue.class);
key.setValue(id);
orders.put(key, order);

请注意,没有averageValue()call 、 nor averageValueSize()、 nor constantValueSizeBySample()

显示的错误消息确实令人困惑,特别是因为 ChronicleMap 已经知道值类是一个值接口并且知道它的大小。随意在https://github.com/OpenHFT/Chronicle-Map中打开一个问题。


推荐阅读