为什么不可能将可迭代对象放入Path引用(实现Iterable?
Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();
for (Path name: dirs) {
System.err.println(name);
}
如果我用Iterable<Path>
更改Path
,它确实会给我一个编译错误。为什么?难道不应该是更多的程序界面吗?
答案 0 :(得分:1)
路径IS-A可转换但可转换不是路径。 所以你需要做类型转换
答案 1 :(得分:1)
所以,查看java.nio.file
API文档:
public interface Path
extends Comparable<Path>, Iterable<Path>, Watchable
所以Path
是Iterable<Path>
。那是什么意思?显而易见的解释是存在递归层次结构的核心概念。事实并非如此。 API有点困惑。 Path
可以由一系列原子元素组成。例如,我猜/etc/passwd
是一个序列(etc, passwd)
。显然,我们在这里有不止一个概念,但建模很薄弱。
所以FileSystem.getRootDirectories
将返回一个集合(不知道为什么它只是Iterable
)一个完全限定的路径。 (例如,我猜(C:\, D:\, Z:\)
。)集合中的每个元素都将(应该有)一系列路径原子。 getRoorDirectories
返回一个具有完全限定路径名作为其元素的Path
是没有意义的。希望返回的Iterable
到Path
的演员表失败。