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