Java lambda类型推断在Kotlin中未按预期工作
为什么这段Java代码没有在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())
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()