java - 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();
解决方案
使用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中打开一个问题。
推荐阅读
- algorithm - 我可以在带有负加权边缘的 DAG 上使用 Dijkstra 算法吗?
- go - 如何安装 go bundle 工具
- java - 更改 jlabel 中的图像
- php - laravel 错误:数组到字符串的转换
- ios - 存折/钱包:通知警告如何工作
- r - 从 R 向量生成唯一对
- sql - 如何在 SQL 中使 ENUM 数据类型小写?
- wordpress - 如何创建在网站左侧有菜单和在顶部有菜单的wordpress主题
- javascript - 如何让这个 javascript 应用于所有这些按钮?
- asp.net - 在 IIS 中部署 Angular 6 应用程序后,我得到一个没有错误的空白页