Path和Paths之间的交互似乎很简单。您使用路径'get()
方法获取Path对象。然后,您可以使用Path的方法:
Path p = Paths.get("C:\\directory\\filename.txt");
p.getFilename();
p.getRoot();
p.getParent();
etc...
令我困惑的是,Java文档将Path描述为一个接口。通常来说,接口只是方法签名的集合,您需要在任何类中实现它们,声明它通过implements
关键字使用它。
但是,在Path的情况下,没有使用'implements'关键字,也没有实现这些方法。它们已经预定义了。
我显然在某个地方得到了错误的结局。有人可以解释一下我误解了什么吗?
答案 0 :(得分: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特定的Path实现。当然在Linux上我们会得到一些不同的东西。使用返回接口的静态工厂方法允许此方法更改此接口的实际实现。
答案 1 :(得分:1)
Path
是一个界面。在代码中的某处选择对象,然后按F4以获取类型层次结构。这将向您展示实际的实现。你会看到这个:
Path
- AbstractPath
- WindowPath
- ZipPath
Paths
是一个具体的实现,它提供的服务是Path
Paths.get(filename)
。 Paths
类将实例化您可以在类型层次结构中看到的具体实现之一。最佳做法是返回Path
这里最通用的类型。因此,您自己的实现独立于Path
的基础实现,可以是WindowPath
或ZipPath
。
答案 2 :(得分:1)
Paths.get("C:\\directory\\filename.txt");
返回生成的Path
实现的对象(基于操作系统)。通过调用默认getPath()
的{{1}}方法获取路径。
答案 3 :(得分:0)
Path
是一个接口,Paths.get()
是用于生成具体实现的工厂方法。
返回的确切具体类将取决于您的操作系统和文件系统类型。