我是科特林的新朋友。我不明白为什么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);
});
}
答案 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()
}