Почему MapDB не работает с kotlin, но работает с Java? - PullRequest
0 голосов
/ 26 января 2019

Я новичок в Котлине. Я не могу понять, почему Map DB не работает для меня с kotlin. Я попробовал Google, но это не помогло.

Gradle

dependencies {
    compile(kotlin("stdlib-jdk8"))
    implementation(group="org.mapdb", name= "mapdb", version= "3.0.7")
    testCompile("junit", "junit", "4.12")
}

File.kt

import org.mapdb.DBMaker

fun main(array: Array<String>) {
    val db = DBMaker.memoryDB().make()
    val map = db.hashMap("map").createOrOpen()
    map.put("a", "a")
    db.close()
}

Ошибка: (7, 13) Kotlin: Несоответствие типов: выведенный тип - String, но Ничего такого? ожидалось. Проектируемый тип HTreeMap ограничивает использование общедоступного открытого веселья (ключ: K ?, значение: V?): V? определенный в org.mapdb.HTreeMap

Ошибка: (7, 18) Kotlin: Несоответствие типов: выведенный тип - String, но Ничего такого? ожидалось. Проектируемый тип HTreeMap ограничивает использование общедоступного открытого веселья (ключ: K ?, значение: V?): V? определенный в org.mapdb.HTreeMap

Но это работает с Java.

public static void main(String[] args) {
        DB db = DBMaker.fileDB("java.db").fileMmapEnable().transactionEnable().make();
        ConcurrentMap map = db.hashMap("map").createOrOpen();
        map.put("a", "b");
        map.put("a2", "b");
        System.out.println(map);
        System.out.println(map.getClass());
        db.commit();
        db.close();

        DB db2 = DBMaker.fileDB("java.db").fileMmapEnable().transactionEnable().make();
        ConcurrentMap map2 = db2.hashMap("map").open();

        System.out.println(map2);
        map2.forEach((o, o2) -> {
            System.out.println(o+" = "+o2);
        });
    }

1 Ответ

0 голосов
/ 26 января 2019

@ gidds совершенно прав в том, что Kotlin не допускает «сырые» типы Java и требует параметров типа. Таким образом, вы можете просто разыграть свою карту, и она будет работать нормально.

fun main(array: Array<String>) {
    val db = DBMaker.memoryDB().make()
    val map = db.hashMap("map").createOrOpen() as MutableMap<String, String>
    map.put("a", "a")
    db.close()
}

Если вам не нравятся непроверенные приведения, как я, вы можете использовать более подробный конструктор HashMapMaker, как этот.

fun main(array: Array<String>) {
    val db = DBMaker.memoryDB().make()
    val map = DB.HashMapMaker<String, String>(db, "map").createOrOpen()
    map["a"] = "a"
    db.close()
}
...