gpt4 book ai didi

java - 等效 Java 和 Kotlin Stream 代码之间的意外类型差异

转载 作者:行者123 更新时间:2023-11-30 06:57:14 27 4
gpt4 key购买 nike

2016 年 3 月 1 日编辑:公平警告:这个问题是关于 Kotlin 1.0.0 之前提出的。自 Kotlin 1.0.0 以来,情况有所不同。有关 Kotlin 1.0.0 的答案,请参阅下面@Jayson Minard 的文章。

在使用 Stream 的 Java 8 代码中,我写了类似的东西

public static void main(String... args) {
Stream<Integer> integerStream = Stream.of(1,2,3);
List<Integer> integerList = integerStream.collect(Collectors.toList());
}

但是在用 Kotlin 编写的类似代码中,我得到了意想不到的结果。

public fun main(args: Array<String>) {
val integerStream : Stream<Int> = Stream.of(1, 2, 3)

// this is what I expect to write, like the Java 8 code, but is a compilation error:
// "required: java.util.List<in kotlin.Int> found: kotlin.MutableList<in kotlin.Int!"
// val list : java.util.List<in Int> = integerStream.collect(Collectors.toList())

// I must instead write this
val list : MutableList<in Int> = integerStream.collect(Collectors.toList())
}

为什么 Stream#collect 表达式的返回值在 Kotlin 代码中与在 Java 代码中是不同的列表类型? (我猜这是因为 Kotlin 中一些特定于 Java 集合的魔法)

最佳答案

我认为这是因为 List 在 Java 中默认是可变的,而在 Kotlin 中它们是不可变的。在您使用 Java 特定实用程序的代码中,Collectors.toList 返回一个 Java List,Kotlin 将其转换为 MutableList,因此实际上,您正在编写相同的代码,只是类型名称不同。

关于java - 等效 Java 和 Kotlin Stream 代码之间的意外类型差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715270/

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