将 ChronicleMap 与泛型一起使用:java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)

Using ChronicleMap with generics: java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)

我有以下 class:

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);
    }
}

我基本上想在包装函数中存储编年史地图。这里,KV 与传递的 keyTypevalueType 值相同。所以我希望 ChronicleMap 地图具有与 KV.

相同的键和值类型

但是,当我创建它时,出现以下错误:

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);

我想知道这个错误是不是因为我对泛型做错了什么。

我在 Windows 10 中使用 ChronicleMap 3.19.4 和 JNA 5.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);

这与泛型无关。您使用的是 Java 12+,它不受支持。内部 sun.nio.ch.FileChannelImpl 在版本 11 到 14 之间发生了变化,并且不向后兼容。

我们的支持政策是仅支持 Java 的 LTS 版本。我们目前支持的最高版本是 Java 11。下一个 LTS 版本 (TBC) 是 17,这是我们接下来计划支持的版本。