我有以下类:
public class ChronicleMapIndex<K, V> implements Index<K, V> {
private ChronicleMap<K, V> index;
private Map<String, String> characteristicsMap;
public void buildIndex(String name, Map<String, String> characteristicsMap, Path indexPath, Class<?> keyType, Class<?> valueType){
this.characteristicsMap = characteristicsMap;
String filename = name + ".bin";
Path indexFilePath = Paths.get(indexPath + filename);
try {
index = (ChronicleMap<K, V>) ChronicleMap
.of(keyType, valueType)
.name(name)
.entries(Long.parseLong(characteristicsMap.get("entries")))
.averageValueSize(Double.parseDouble(characteristicsMap.get("averageValueSize")))
.averageKeySize(Double.parseDouble(characteristicsMap.get("averageKeySize")))
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public V get(K key) {
return index.get(key);
}
@Override
public void put(K key, V value) {
index.put(key, value);
}
}
我基本上想在一个包装器函数中存储一个编年史地图。这里,K
和V
与传递的keyType
和valueType
值相同。因此,我希望ChronicleMap映射具有与K
和V
相同的键和值类型。
然而,当我创建它时,我得到了以下错误:
net.openhft.chronicle.hash.ChronicleHashRecoveryFailedException: java.lang.AssertionError: java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)
at net.openhft.chronicle.map.ChronicleMapBuilder.openWithExistingFile(ChronicleMapBuilder.java:1877)
at net.openhft.chronicle.map.ChronicleMapBuilder.createWithFile(ChronicleMapBuilder.java:1701)
at net.openhft.chronicle.map.ChronicleMapBuilder.recoverPersistedTo(ChronicleMapBuilder.java:1655)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1638)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1629)
at edu.upf.taln.indexer.index.chroniclemap.ChronicleMapIndex.buildIndex(ChronicleMapIndex.java:27)
在这一行中:
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
我想知道这个错误是不是因为我在泛型上做错了什么。
我在Windows10中使用的是ChronicleMap 3.19.4和JNA5.5.0。
下面是一个您可以轻松运行的单独测试:
Map<String, String> characteristicsMap = new HashMap<>();
characteristicsMap.put("entries", Long.toString(123));
characteristicsMap.put("averageKeySize", Integer.toString(5));
characteristicsMap.put("averageValueSize", Integer.toString(5));
String name = "test";
Path indexPath = Paths.get("D:/trabajo"); // substitute this as needed
ChronicleMapIndex<String, String> index = new ChronicleMapIndex<>();
index.buildIndex(name, characteristicsMap, indexPath ,String.class, String.class);
发布于 2020-06-12 05:22:49
这与泛型无关。您正在使用Java 12+,但它不受支持。内部sun.nio.ch.FileChannelImpl在版本11到14之间发生了变化,并且不是向后兼容的。
我们的支持政策是只支持Java的LTS版本。我们现在支持的最高版本是Java 11,下一个LTS版本(TBC)是17,我们计划下一步支持这个版本。
https://stackoverflow.com/questions/62328831
复制相似问题