【问题标题】:Kotlin cast from LinkedHashMap<String, String> to String?Kotlin 从 LinkedHashMap<String, String> 转换为 String?
【发布时间】:2019-12-19 07:30:18
【问题描述】:

我正在解析一个非常简单的 YAML 文件。

这是我的代码:

val yaml = Yaml()
val inputStream: InputStream = FileInputStream("permissions.yml")
val obj = yaml.load<LinkedHashMap<String, String>>(inputStream)
println(obj.get("accepted_groups")) // prints [A, B]
val group = obj.get("accepted_groups") // crashes

错误是 java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.lang.String 那么 println 是如何管理打印对象的呢?如何从此 LinkedHashMap 中检索数组?

【问题讨论】:

  • 如何从这个 LinkedHashMap 中检索一个数组?
  • 与accepted_groups 关联的实际值是一个ArrayList。但是你被告知 Kotlin 编译器 yaml.load() 将返回一个 LinkedHashMap,其中包含字符串作为值。因此编译器向 String 插入了强制转换,因此出现了异常。您需要提供正确的泛型类型。
  • yamlLoad() 返回一个 LinkedHashMap。 val inputStream: InputStream = FileInputStream("permissions.yml") val obj = yaml.load>(inputStream) 给出错误 class java.util.LinkedHashMap cannot be cast to class java.util.ArrayList
  • 虽然@AlexeyRomanov 说代码中没有演员表。那么它是如何发生 ClassCastException 的呢?
  • 它返回一个地图。但是 Map 中的 values 不是您声称的字符串。其中至少有一个是 List。

标签: spring-boot kotlin


【解决方案1】:

问题在于您的 YAML 文件中的值不是(全部)字符串。 IE。它看起来像

accepted_groups:
    - A
    - B

不是

accepted_groups: "[A, B]"

所以LinkedHashMap&lt;String, String&gt; 只是使用错误的类型。 什么是正确的类型,不能不知道就说:

  1. 文件的实际结构;

  2. Yaml 类来自哪个库(不是 Kotlin 标准库,也不是您在标签中提到的 Spring Boot)。

LinkedHashMap&lt;String, Any&gt; 可能会起作用,但不是最佳选择。

那么 println 是如何打印对象的呢?

通过调用toString,就像对任何对象所做的那样。

问题

val group = obj.get("accepted_groups")

是通过使用LinkedHashMap&lt;String, String&gt; 推断group 的类型是String,但实际存储的值不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2022-01-02
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多