我想将 HOCON (Typesafe Config) 文件中的以下配置读入 Kotlin。
tablename: {
columns: [
{ item: { type: integer, key: true, null: false } }
{ desc: { type: varchar, length: 64 } }
{ quantity: { type: integer, null: false } }
{ price: { type: decimal, precision: 14, scale: 3 } }
]
}
事实上,我想提取关键列。到目前为止,我已经尝试过以下方法。
val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }
但它失败并出现以下错误。
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, ???>.get(key: kotlin.String): ??? defined in kotlin.collections
很明显,Kotlin 无法理解 Map 中“值”字段的数据类型。我如何声明或让 Kotlin 知道?
也不是说此 Map 中有不同的类型和可选键。
PS:我知道有几个可用于 Kotlin 的包装器,例如 Konfig 和 Klutter。我希望如果这很容易编写,我可以避免使用另一个库。
更新 1:
我尝试了以下方法。
it.unwrapped().values.first().get<String, Boolean>("key")
得到以下编译器错误。
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections
和这个
it.unwrapped().values.first().get<String, Boolean?>("key")
带输出
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean?>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections
更新 2:
看看它在其他地方的处理方式,我想我可能需要使用反射。在我有限的曝光范围内尝试一下。到目前为止没有运气。