Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转换Java映射以在Kotlin中读取它?_Kotlin - Fatal编程技术网

如何转换Java映射以在Kotlin中读取它?

如何转换Java映射以在Kotlin中读取它?,kotlin,Kotlin,我面临一些非常基本的问题(java以前从未遇到过),这可能是因为我缺乏Kotlin方面的知识 我目前正在尝试读取一个YML文件。所以我是这样做的: private val factory = YamlConfigurationFactory(LinkedHashMap::class.java, validator, objectMapper, "dw") 最佳拖放向导配置指南 因此,在我的函数后面,我会这样做“ 当使用我的调试器时,我可以看到有一个带有key->value的映射,就像它应该的

我面临一些非常基本的问题(java以前从未遇到过),这可能是因为我缺乏Kotlin方面的知识

我目前正在尝试读取一个YML文件。所以我是这样做的:

private val factory = YamlConfigurationFactory(LinkedHashMap::class.java, validator, objectMapper, "dw")
最佳拖放向导配置指南

因此,在我的函数后面,我会这样做“

当使用我的调试器时,我可以看到有一个带有key->value的映射,就像它应该的那样

现在,当我执行keyValues.get(“我的密钥”)时

我试过了,但运气不好

var keyValues =  LinkedHashMap<String, Any>()
keyValues =  factory.build(yml)
这里它也抛出了一个错误


想法?

好吧,这是JVM泛型的一个典型问题。
Class
没有关于其键和值的实际类型的信息,因此
keyValues
变量总是以类型
LinkedHashMap
结束,因为它在编译时无法检查。有两种方法:

不安全铸造 这就是在标准Java中处理问题的方法:只需将
LinkedHashMap
转换为
LinkedHashMap
(或任何实际期望的类型)。这会产生一个警告,因为编译器无法验证强制转换是否安全,但众所周知,在处理JVM泛型和序列化时,这种情况通常是不可避免的

YamlConfigurationFactory(LinkedHashMap::class.java, ...) as LinkedHashMap<String, Any>
YAMLConfiguration工厂(LinkedHashMap::class.java,…)作为LinkedHashMap
类型推理魔术 使用Kotlin时,您可以通过显式地创建
类的实例来避免强制转换。当然,因为这仍然是JVM,所以您在运行时会丢失所有类型信息,但这应该足以告诉类型推理引擎您的结果应该是什么。不过,您需要一个特殊的助手方法来实现这一点(或者至少我还没有找到一个更简单的解决方案),但该方法只需要在项目中的某个地方声明一次:

inline fun <reified T> classOf(): Class<T> = T::class.java
...
val factory = YamlConfigurationFactory(classOf<LinkedHashMap<String, Any>>(), ...)
inline fun classOf():Class=T::Class.java
...
val factory=YAMLConfiguration工厂(classOf(),…)
使用此“hack”,您将直接获得LinkedHashMap的一个实例,但是,请始终记住,这只是类型推断引擎的额外信息,但实际上它只是隐藏了不安全的强制转换。此外,如果编译类型(
具体化
)中不知道该类型,则无法使用此方法

LinkedHashMap::class.java.kotlin
YamlConfigurationFactory(LinkedHashMap::class.java, ...) as LinkedHashMap<String, Any>
inline fun <reified T> classOf(): Class<T> = T::class.java
...
val factory = YamlConfigurationFactory(classOf<LinkedHashMap<String, Any>>(), ...)