gpt4 book ai didi

kotlin - 如何转换Java Map以在Kotlin中读取它?

转载 作者:行者123 更新时间:2023-12-02 13:36:02 25 4
gpt4 key购买 nike

我遇到了一些非常基本的问题(以前在Java中从未遇到过),可能是由于我对Kotlin的了解不足。

我目前正在尝试读取YML文件。所以我以这种方式这样做:

private val factory = YamlConfigurationFactory(LinkedHashMap::class.java, validator, objectMapper, "dw")

有关Dropwizard的最佳配置指南。

https://www.dropwizard.io/1.3.12/docs/manual/testing.html

所以稍后在我的工作中,我会这样做”
 val yml = File(Paths.get("config.yml").toUri())
var keyValues = factory.build(yml)

使用调试器时,我可以看到有一个键->值的映射,正如应该的那样。

现在当我做keyValues.get(“my-key”)
type inference failed. the value of the type parameter k should be mentioned in input types

尝试了这个但没有运气
var keyValues =  LinkedHashMap<String, Any>()
keyValues = factory.build(yml)

YamlConfigurationFactory需要映射到一个类,但是我不知道是否有比当前解决方案+ .kotlin更直接的方法来指定Kotlin类,例如
LinkedHashMap::class.java.kotlin

在这里它也会引发错误。

有想法吗?

最佳答案

好吧,这是JVM泛型的一个典型问题。 Class<LinkedHashMap>不包含有关其键和值的实际类型是什么的信息,因此keyValues变量始终以LinkedHashMap<*, *>类型结尾,这仅仅是因为无法在编译时进行检查。有两种解决方法:

不安全的 Actor 表

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

YamlConfigurationFactory(LinkedHashMap::class.java, ...) as LinkedHashMap<String, Any>

类型推理魔术

使用Kotlin时,可以通过显式实际创建 Class<LinkedHashMap<String, Any>>实例来避免转换。当然,由于这仍然是JVM,因此您会在运行时丢失所有类型信息,但是足以告诉类型推断引擎您的结果是什么。但是,您将需要一个特殊的辅助方法(或者至少我还没有找到一个更简单的解决方案),但是该方法只需在项目中的某个位置声明一次:
inline fun <reified T> classOf(): Class<T> = T::class.java
...
val factory = YamlConfigurationFactory(classOf<LinkedHashMap<String, Any>>(), ...)

使用此“hack”,您将直接获得LinkedHashMap的实例,但是,请始终记住,这只是类型推断引擎的额外信息,但实际上它只是隐藏了不安全的类型转换。另外,如果编译类型( reified)未知该类型,则不能使用它。

关于kotlin - 如何转换Java Map以在Kotlin中读取它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com