import声明并不意味着声明您的代码正在使用什么类;他们只是声明用来解析不合格标识符的内容。因此,如果您
Path在代码中使用了非限定标识符,则必须
importjava.nio.file.Path;声明该标识符应解析为该限定类型。顺便说一下,这不是解析名称的唯一方法。名称也可以通过类继承来解析,例如,如果它们与继承的成员类的简单名称匹配。
如果隐式使用类型而不引用其名称,则不需要
import声明,这不仅限于lambda表达式,它甚至不是Java 8的特殊功能。例如,
Files.walk(Paths.get("C:/Users/mbmas_000/Downloads/SEC Edgar"), 1)您已经
Path隐式使用了类型,因为它是的返回类型
Paths.get和参数类型
Files.walk,换句话说,您正在接收的实例
java.nio.file.Path并将其传递给另一个方法而无需引用其类型名称,因此您不需要
import。此外,您正在调用varargs方法,该方法接受任意数量的
FileVisitOption实例。您没有指定任何内容,因此您的代码将创建一个零长度的
FileVisitOption[]数组,并将其
Files.walk再次传递给,而无需添加
import。
通过改进的类型推断,还有一种可能使用类型而不引用其名称的可能性,例如,如果您调用:
Files.newByteChannel(path, new HashSet<>());
您不仅
FileAttribute[]要为varargs参数创建一个零长度的数组,而不必按名称引用此类型,而且还要创建一个
HashSet<OpenOption>不
OpenOption按名称引用类型的a。因此,这也不要求import
java.nio.file.attribute.FileAttribute或
java.nio.file.OpenOption。
因此,最重要的是,是否需要an
import不取决于类型的使用,而是取决于您是否通过其简单名称来引用它(并且有多种方法可以使用类型而不通过名称来引用它)。在第二个示例中,您将
Path在方法中引用名称
printPath(PathpassedFilePath);如果将其更改为
printPath(ObjectpassedFilePath),则无需显式
import的,一切都会再次起作用
java.nio.file.Path。



