Java lambda类型推断在Kotlin中未按预期工作

Java lambda类型推断在Kotlin中未按预期工作,kotlin,kotlin-interop,Kotlin,Kotlin Interop,为什么这段Java代码没有在Collectors.toList()中使用显式类型参数在Kotlin中编译?有没有更惯用的方法 // works List<String> folders = Files.walk(Paths.get(args[0]))          .filter(it -> it.toFile().isDirectory())            .map(it -> it.toAbsolutePath().toString())    

为什么这段Java代码没有在
Collectors.toList()
中使用显式类型参数在Kotlin中编译?有没有更惯用的方法

// works
List<String> folders = Files.walk(Paths.get(args[0]))
            .filter(it -> it.toFile().isDirectory())
            .map(it -> it.toAbsolutePath().toString())
            .collect(Collectors.toList());

// does not compile - resulting type is `MutableList<in String!>..List<Any?>?` which is not compatible to `List<String>`
val folders: List<String> = Files.walk(Paths.get(args[0]))
            .filter { it.toFile().isDirectory }
            .map { it.toAbsolutePath().toString() }
            .collect(Collectors.toList())

// compiles
val folders: List<String> = Files.walk(Paths.get(args[0]))
            .filter { it.toFile().isDirectory }
            .map { it.toAbsolutePath().toString() }
            .collect(Collectors.toList<String>())
//有效
列表文件夹=文件.walk(路径.get(args[0]))
.filter(it->it.toFile().isDirectory())
.map(it->it.ToAbsolutionPath().toString())
.collect(Collectors.toList());
//未编译-结果类型为'MutableList..List?`与'List'不兼容`
val文件夹:List=Files.walk(path.get(args[0]))
.filter{it.toFile().isDirectory}
.map{it.toAbsolutionPath().toString()}
.collect(收集器.toList())
//汇编
val文件夹:List=Files.walk(path.get(args[0]))
.filter{it.toFile().isDirectory}
.map{it.toAbsolutionPath().toString()}
.collect(收集器.toList())

我找到了两种方法,可以在不在两个位置显式指定泛型类型的情况下使其工作

您可以使用以下两种方法之一指定变量的完整类型:

val文件夹:MutableList=Files.walk(path.get(args[0]))
.filter{it.toFile().isDirectory}
.map{it.toAbsolutionPath().toString()}
.collect(收集器.toList())
或者您可以简单地让Kotlin对变量(而不是方法的泛型参数)进行类型推断

val folders2=Files.walk(path.get(args[0]))
.filter{it.toFile().isDirectory}
.map{it.toAbsolutionPath().toString()}
.collect(收集器.toList())
为什么这段Java代码没有在
Collectors.toList()
中使用显式类型参数在Kotlin中编译

在我看来,这像是一个编译器错误。我建议在中创建一个问题

有没有更惯用的方法

// works
List<String> folders = Files.walk(Paths.get(args[0]))
            .filter(it -> it.toFile().isDirectory())
            .map(it -> it.toAbsolutePath().toString())
            .collect(Collectors.toList());

// does not compile - resulting type is `MutableList<in String!>..List<Any?>?` which is not compatible to `List<String>`
val folders: List<String> = Files.walk(Paths.get(args[0]))
            .filter { it.toFile().isDirectory }
            .map { it.toAbsolutePath().toString() }
            .collect(Collectors.toList())

// compiles
val folders: List<String> = Files.walk(Paths.get(args[0]))
            .filter { it.toFile().isDirectory }
            .map { it.toAbsolutePath().toString() }
            .collect(Collectors.toList<String>())
对。例如,“Kotlin有自己的
文件.walk
扩展方法。”例如:

val文件夹:List=File(args[0]).walk()
.filter(文件::isDirectory)
.map(文件::getAbsolutePath)
托利斯先生()
如果您更喜欢使用Java8流,请签出。它定义了一个
Stream.toList()
函数:

val folders: List<String> = Files.walk(Paths.get(args[0]))
        .filter { it.toFile().isDirectory }
        .map { it.toAbsolutePath().toString() }
        .toList()
val文件夹:List=Files.walk(path.get(args[0]))
.filter{it.toFile().isDirectory}
.map{it.toAbsolutionPath().toString()}
托利斯先生()

只是一个旁注,Kotlin有自己的
文件。walk
扩展方法。你在类型推断@Ilya中偶然发现了一个错误,谢谢你的链接-很好,已经有了一张罚单。
MutableList
很少是人们期望从
collect
中得到的结果。第二个解决方法是可以的。我想添加
Stream.toList()
已经在coming Kotlin 1.1的标准库中。嗨,当我使用File(path).walk()方法时,列表只包含path中的目录名,而不包含此目录中的文件。有什么想法吗?
val folders: List<String> = File(args[0]).walk()
        .filter(File::isDirectory)
        .map(File::getAbsolutePath)
        .toList()
val folders: List<String> = Files.walk(Paths.get(args[0]))
        .filter { it.toFile().isDirectory }
        .map { it.toAbsolutePath().toString() }
        .toList()