【问题标题】:Java Types in KotlinKotlin 中的 Java 类型
【发布时间】:2021-06-14 07:50:27
【问题描述】:

我正在使用 Kotlin 中的 Java Lib。 一个(重要的)函数需要一个 java.util.HashMap 作为参数。

在 Java 中,大多数类型都是 java.lang.Object 的一部分。在 Kotlin 中并非如此,它们是 Any 的一部分。

我需要在 HashMap 中放入 String 和 int 类型的字符串键和值。像这样:

val parameters = java.util.HashMap<String,Object>()
parameters.put("Key1", 5)
paramerers.put("Key2", "Hello")

当然,在这种情况下,它们是不扩展 Java Object 类的 Kotlin 类型。 我的问题是它们必须是 java.lang.Object 的一部分才能使用 lib。 我该如何存档?

提前谢谢你。

【问题讨论】:

  • 实际上,Java 中的原语不是 Object 的子类型。您可能指的是 Integer 之类的类型,但这不是原语 - 这是原语 int 的包装器。
  • 是的,你是对的,把它弄混了一点

标签: java kotlin kotlin-java-interop


【解决方案1】:

Any 和 Object 是 mapped types。 Java 代码将 every 类视为 Object 的后代(无论它是否在 Kotlin 中定义),而 Kotlin 将 every 类视为 Any 的后代(无论是否是在 Java 中定义的)。当您将对象从 Kotlin 传递给 Java 类时,它们满足 Object 类型要求。

Kotlin 也可以引用 Object 类型,但不这样做会更简洁,否则会导致您遇到的问题。您可以使用 Any 来表示相同的事物。将它作为参数的 Java 方法不会抱怨。您也不需要指定java.util.HashMap,因为 Kotlin HashMap 和 Java HashMap 是同一个类。 Kotlin 版本只是 Java HashMap 的typealias

您上面的代码相当于:

val parameters = HashMap<String, Any>()
parameters.put("key1", 5)
parameters.put("key2", "Hello")

或更典型的 Kotlin 模式:

val parameters = hashMapOf<String, Any>(
    "key1" to 5,
    "key2" to "Hello"
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2019-09-19
    相关资源
    最近更新 更多