【发布时间】: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