为什么MapDB不能与kotlin一起使用而是与Java一起使用?

时间:2019-01-26 02:42:20

标签: java collections kotlin mapdb

我是科特林的新朋友。我不明白为什么Map DB对kotlin不起作用。我尝试了google,但没有帮助。

渐变

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 :(得分: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()
}