Scala中Files.walk的Lambda类型不兼容问题求助
Scala中使用Java NIO Files.walk时map方法类型不兼容问题解决
你的问题出在Scala类型推断与Java泛型通配符的交互上。Java的Files.walk返回java.util.stream.Stream[Path],它的map方法要求的Function带有通配符约束,而Scala自动生成的lambda无法满足该约束的类型推断要求。
以下是两种可行的解决办法:
方法一:将Java Stream转换为Scala集合处理
借助Scala提供的Java/Scala集合转换工具,把Java Stream转成Scala惰性集合,使用Scala原生的map和foreach方法,彻底规避类型兼容问题:
import java.nio.file.{FileSystems, Files} import scala.jdk.javaapi.StreamConverters object ScalaHello extends App { val dir = FileSystems.getDefault.getPath("/home/intelli/workspace") StreamConverters.toScala(Files.walk(dir)) .map(_.toFile) .foreach(println) }
方法二:显式指定Java map方法的泛型类型
给Java的map方法明确指定泛型参数R,同时给lambda参数加上类型注解,让Scala能正确推断出符合约束要求的Function类型:
import java.nio.file.{FileSystems, Files} object ScalaHello extends App { val dir = FileSystems.getDefault.getPath("/home/intelli/workspace") Files.walk(dir).map[java.io.File]((p: java.nio.file.Path) => p.toFile).forEach(println) }
问题根源
Java的Stream.map方法定义为:
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
其中? super T和? extends R是通配符约束,Scala的类型推断在处理这类Java泛型时,无法自动生成满足约束的Function实例,必须通过显式指定类型或者转换为Scala集合来解决。
内容的提问来源于stack exchange,提问作者diegoruizbarbero
相关产品推荐
相关产品推荐

