4

Path 和 Paths 之间的交互看起来很简单。get()您可以使用 Paths 的方法获得一个 Path 对象。然后您可以使用 Path 的方法:

Path p = Paths.get("C:\\directory\\filename.txt");
p.getFilename();
p.getRoot();
p.getParent();
etc...

令我困惑的是,Java 文档将 Path 描述为一个接口。implements通常来说,接口只是方法签名的集合,您需要在任何通过关键字声明它使用它的类中实现它。

但是,在 Path 的情况下,没有使用“implements”关键字,您也没有实现这些方法。它们已经预定义。

我显然在某个地方搞错了。有人可以解释我误解了什么吗?

4

4 回答 4

5

它是 OOP 替代原则http://en.wikipedia.org/wiki/Liskov_substitution_principle

If S is a T, then references to T can be changed to references to S

在我们的例子中,这意味着 Paths 可以返回任何实现 Path 的类的实例。如果我打印实际的班级名称

System.out.println(p.getClass());

我去拿

class sun.nio.fs.WindowsPath

如您所见,这是 Windows 特定的路径实现。在 Linux 上,我们自然会得到不同的东西。使用返回接口的静态工厂方法允许此方法更改此接口的实际实现。

于 2013-05-08T07:52:57.493 回答
1
Paths.get("C:\\directory\\filename.txt"); 

返回Path实现的Object(基于OS)。Path是通过调用getPath()default的方法获得的FileSystem

于 2013-05-08T07:54:23.767 回答
1

Path是一个接口。在代码中的某处选择对象,然后按 F4 以获取类型层次结构。这将向您展示实际的实现。你会看到这个:

Path
- AbstractPath
  - WindowPath
- ZipPath

Paths是一个具体的实现,它提供了返回 a Pathby的服务Paths.get(filename)。该类Paths将实例化您可以在类型层次结构中看到的具体实现之一。最佳做法是返回Path此处最通用的类​​型。因此,您自己的实现独立于 的底层实现Path,它可以是 aWindowPath或 a ZipPath

于 2013-05-08T07:49:39.290 回答
0

Path是一个接口,Paths.get()是一种用于产生具体实现的工厂方法。

返回的具体类取决于您的操作系统和文件系统类型。

于 2013-05-08T07:52:50.947 回答