【问题标题】:Why MapDB is not working with kotlin but works with Java?为什么 MapDB 不能与 kotlin 一起使用,但可以与 Java 一起使用?
【发布时间】:2019-06-19 21:02:42
【问题描述】:

我是 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: Type mismatch: inferred type is String but 没有?预料之中。投影类型 HTreeMap 限制使用 public open fun put(key: K?, value: V?): V?定义 在 org.mapdb.HTreeMap 中

错误:(7, 18) Kotlin: Type mismatch: inferred type is String but 没有?预料之中。投影类型 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);
        });
    }

【问题讨论】:

  • 我没有使用过这个库或尝试过你的代码,但从错误消息中我猜这是关于地图的类型参数。 Java 允许“原始”类型,您不必指定类型参数并且允许任何内容,但 Kotlin 不允许。看起来 Kotlin 无法分辨映射的键或值类型是什么,因此当您尝试 put() 字符串到字符串的映射时会抱怨。我会尝试将地图转换为 MutableMap.
  • 明确一点,在 Java 中使用原始类型也很糟糕,它们的存在主要是为了让真正古老的预泛型代码无需更改即可编译。

标签: java collections kotlin mapdb


【解决方案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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多