0

我是 Kotlin 的新手。我不明白为什么 Map DB 不适用于 kotlin。我试过谷歌,但没有帮助。

毕业典礼

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

文件.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:类型不匹配:推断的类型是字符串但什么都没有?预料之中。投影类型 HTreeMap 限制使用 public open fun put(key: K?, value: V?): V? 在 org.mapdb.HTreeMap 中定义

错误:(7, 18) Kotlin:类型不匹配:推断类型是字符串但什么都没有?预料之中。投影类型 HTreeMap 限制使用 public open fun put(key: K?, value: 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);
        });
    }
4

1 回答 1

1

@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()
}
于 2019-01-26T11:36:09.190 回答