【问题标题】:Iterable<Path> vs Path可迭代<Path> vs 路径
【发布时间】:2013-05-11 10:56:16
【问题描述】:

为什么不能将可迭代对象放入 Path 引用(实现 Iterable?

Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();
for (Path name: dirs) {
    System.err.println(name);
}

如果我将Iterable&lt;Path&gt; 更改为Path,它确实会给我一个编译错误。为什么?不应该更注重程序到界面吗?

【问题讨论】:

  • 我不明白这个问题。你能否补充说明你认为你应该能够写什么,以及你期望它做什么。
  • PathIterable&lt;Path&gt; 更专业 - 因此,如果 getRootDirectories() 仅与 Iterable&lt;Path&gt; 签约,则不能将其分配给更特殊的类型。

标签: java path iterable


【解决方案1】:

所以,查看java.nio.file API 文档:

public interface Path
    extends Comparable<Path>, Iterable<Path>, Watchable

所以PathIterable&lt;Path&gt;。这意味着什么?显而易见的解释是递归层次结构的核心概念。事实并非如此。 API有点混乱。 Path 可以由一系列原子元素组成。例如,我猜/etc/passwd 是一个序列(etc, passwd)。显然我们这里有不止一个概念,但是建模很弱。

所以FileSystem.getRootDirectories 将返回一个完全限定路径(不知道为什么它只是Iterable)。 (例如,我猜(C:\, D:\, Z:\)。)集合的每个元素都将是(应该有)一个路径原子序列。 getRoorDirectories 返回单个 Path 没有意义,该 Path 具有完整的路径名称作为其元素。希望返回的IterablePath 的转换应该失败。

【讨论】:

    【解决方案2】:

    路径是可迭代但可迭代不是路径。 所以你需要做类型转换

    【讨论】:

    • 演员真的应该失败!
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2018-04-04
    • 2018-03-15
    • 2020-05-22
    相关资源
    最近更新 更多