流映射错误:类型不匹配

时间:2018-02-23 19:29:12

标签: scala

我正在学习Scala,我想在Scala中编写以下Java代码。

Java代码:

Files
 .walk(Paths.get("R:\\scala"))
 .filter(p-> isRegularFile(p))
 .map(Path::getFileName)
 .map(Path::toString)
 .forEach(System.out::println);

我无法理解下面的Scala代码的以下错误消息。我应该改变什么?如果我使用_符号,我会收到更多错误:

Error:(12, 11) type mismatch;
 found   : java.util.function.Function[java.nio.file.Path,String]
 required: java.util.function.Function[? >: ?0, ?]
Note: java.nio.file.Path <: ? >: ?0, but Java-defined trait Function is 
invariant in type T.
You may wish to investigate a wildcard type such as `_ <: ? >: ?0`. (SLS 3.2.10)
     .map(new java.util.function.Function[Path, String]() {

Scala代码:

Files
 .walk(Paths.get("R:\\scala"))
 .filter(isRegularFile(_))
 .map(new java.util.function.Function[Path,Path](){
   def apply(p:Path): Path = p.getFileName
 })
 .map(new java.util.function.Function[Path,String](){
   def apply(p:Path):String = p.toString
 })
 .forEach(println(_))

1 个答案:

答案 0 :(得分:2)

在这种情况下,Scala很难推断类型(很想听听智能人比我更好的原因)。同时,您可以通过使用类型提示注释.map方法来帮助Scala编译器:

Files
  .walk(Paths.get("R:\\scala"))
  .filter(isRegularFile(_))
  .map[Path](new java.util.function.Function[Path,Path](){
    def apply(p:Path): Path = p.getFileName
  })
  .map[String](new java.util.function.Function[Path,String](){
    def apply(p:Path):String = p.toString
  })
  .forEach(println(_))

顺便说一句,如果您使用的是Scala 2.12,那么您可以使用单个抽象方法替换java.util.function.Function,使您的代码看起来像:

Files
  .walk(Paths.get("R:\\scala"))
  .filter(isRegularFile(_))
  .map[Path]((p: Path) => p.getFileName)
  .map[String]((p: Path) => p.toString)
  .forEach(println(_))