Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等效Java和Kotlin流代码之间的意外类型差异_Java_Generics_Kotlin - Fatal编程技术网

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

等效Java和Kotlin流代码之间的意外类型差异,java,generics,kotlin,Java,Generics,Kotlin,2016年3月1日编辑:公平警告:该问题是在1.0.0之前就Kotlin提出的。自Kotlin 1.0.0以来,情况有所不同。关于Kotlin 1.0.0的答案,请参见下文@Jayson Minard的文章 在使用流的Java8代码中,我编写了如下内容 public static void main(String... args) { Stream<Integer> integerStream = Stream.of(1,2,3); List<Integer&g

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

在使用流的Java8代码中,我编写了如下内容

public static void main(String... args) {
    Stream<Integer> integerStream = Stream.of(1,2,3);
    List<Integer> integerList = integerStream.collect(Collectors.toList());
}
publicstaticvoidmain(字符串…参数){
流整数流=流(1,2,3);
List 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())
}
public fun main(args:Array){
val integerStream:Stream=Stream.of(1,2,3)
//这是我希望编写的代码,就像Java 8代码一样,但这是一个编译错误:

//“required:java.util.List found:kotlin.MutableList我认为这是因为java中的
List
是可更改的,默认情况下,与kotlin一样,它们是不可更改的。
在代码中,您使用的是一个Java特定的实用程序,
Collectors.toList
,它返回一个Java
List
,对Kotlin来说,它翻译为一个
MutableList
,因此实际上您编写的代码是相同的,只是类型名称不同。

您可以在Kotlin 1.0中执行此操作:

val integerStream : Stream<Int> = Stream.of(1, 2, 3)
val list : List<Int> = integerStream.collect(Collectors.toList<Int>())
然后将其用于任何
列表
的转换:

val integerStream = Stream.of(1, 2, 3)
val list = integerStream.toList()

val stringStream = Stream.of("a", "b", "c")
val stringList = stringStream.toList()
最后一个示例已经返回了
List
的只读接口,而不是
MutableList
。有关这些接口与Kotlin中其他映射接口之间的差异,请参阅文档以了解更多信息

最后,另一个变体是转换为
序列
并保持惰性,因为它是与
等价的Kotlin

fun <T: Any> Stream<T>.asSequence(): Sequence<T> = this.iterator().asSequence()
fun Stream.asSequence():Sequence=this.iterator().asSequence()

或者
Stream.iterator()
是相似的,但不是相同的。

所以,换言之,“Kotlin禁止Java集合类型”?我非常好奇了解更多细节。可能是这样。我必须阅读文档才能找到答案。(我还没有尝试Kotlin/Java Interop)愚蠢的我,它在“Java Interop”中说的没错“文档的一部分,其中一些类型在Java和Kotlin之间自动映射。另请参见:在Kotlin 1.0中,您应该能够将类型设置为
List
,这样就可以了。但是您的
toList()
由于上面评论中的链接中提到了一个错误,呼叫需要
toList
。您在顶部的评论…您可以更改已接受的答案。StackOverflow的想法是帮助新用户阅读帖子,而不是历史准确性。事情应该始终更新为最新。感谢顶部的注释,它将帮助我们同时,ers!回避了这个问题;是否所有的问题和答案都会根据他们所写的语言/软件/框架或库的当前版本进行审核?非常有趣。
fun <T: Any> Stream<T>.toList(): List<T> = this.collect(Collectors.toList<T>())
val integerStream = Stream.of(1, 2, 3)
val list = integerStream.toList()

val stringStream = Stream.of("a", "b", "c")
val stringList = stringStream.toList()
fun <T: Any> Stream<T>.asSequence(): Sequence<T> = this.iterator().asSequence()