【问题标题】:Kotlin (Mutable)ListKotlin(可变)列表
【发布时间】:2019-06-13 01:24:27
【问题描述】:

如果您在 Kotlin 中访问 List<[Some Type]> 类型的 Java 值,您将获得 (Mutable)List<[Some Type]!>! 类型。

例如:

Java 代码:

public class Example {
    public static List<String> getList() {
        return Arrays.asList("A", "B", "C");
    }
}

Kotlin 代码:

val list = Example.getList()
// list is of type (Mutable)List<String!>!

这是 IntelliJ 的显示方式:

但是,如果您想像这样创建自己的这种类型的变量:

val list2: (Mutable)List<String>

然后 IntelliJ 将正确突出显示类型,但会给出错误Unexpected Tokens

这是什么(Mutable)List

【问题讨论】:

标签: kotlin kotlin-interop


【解决方案1】:

在 Kotlin 中没有类型 (Mutable)List

这表示Example.getList() 返回的列表类型 不会在编译时决定,但会在运行时决定。
在您的情况下,它将是List 而不是MutableList,因为Arrays.asList() 返回FixedSizeList

如果你像这样实现Example.getList()

public static List<String> getList() {
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    return list;
}

那么在运行时,您的list 的类型将是MutableList

【讨论】:

    【解决方案2】:

    这是一个 IDEA 工具提示,告诉您这个列表可能是 MutableList、List,因为 Example 是 Java 类,它可以返回任何类型的列表。

    同样,String 也会发生同样的情况:您对 list 的 String 可空性一无所知,因为它是从 Java 返回的,所以 String 看起来像 String!,意思是“也许它是空的,但也许不是”而不影响编译(即您可以在没有空检查的情况下对其调用方法,就像在空检查时一样:不会出现警告)。

    【讨论】:

    • Any! 用于调用没有为特定变量定义@Nullable 或@NotNull 的Java 代码。这通常发生在 Java 代码中,因为它总是在 Kotlin 中定义。这也意味着 Kotlin 将无法抱怨 null 安全性,因为它不知道它是否为 null。如果你在运行时得到 null,它仍然会崩溃。
    【解决方案3】:

    MutableList 是 kotlin 中的一个接口。 要声明一个变量,我们需要使用类似 as 的类

        val list2: ArrayList<String>
    

    @约瑟夫佐勒

    【讨论】:

    • val: list: MutableList&lt;String&gt; 也是允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多