为什么java.nio.file.DirectoryStream使用无界泛型?

时间:2017-01-15 11:54:44

标签: java generics

我见过DirectoryStream的唯一用法是使用Path类型作为其类型参数DirectoryStream<Path>来自Files.newDirectoryStream(Path)

此外,由于documentation中的以下陈述,我不明白为什么它允许任何类型:

  

如果hasNext方法返回true,然后调用下一个方法,则可以保证下一个方法不会因I / O错误而抛出异常,或者因为流已经关闭。

这必须意味着它会检查Path是否可以预先访问,因此不能是通用类型。

3 个答案:

答案 0 :(得分:3)

  

为什么java.nio.file.DirectoryStream使用无限制的泛型?

     

我见过DirectoryStream的唯一用法是使用Path类型作为其类型参数DirectoryStream<Path>来自Files.newDirectoryStream(Path)

如果您查看SecureDirectoryStream,该界面会使用无界通用扩展DirectoryStream。但是,SecureDirectoryStream的唯一具体实现也使用Path参数化。

所以,最合理的解释是:

  • 参数化是为了启用未来可能的增强功能,或
  • 原本打算提供File的目录流,但它已被放弃......为时尚晚,无法完全摆脱参数。

无论哪种方式,该参数目前都是无害的异常。

  

这必须意味着它会检查Path是否可以预先访问,因此不能是泛型类型。

该参数可能是无限制的,因为PathFile没有合适的公共超级接口。它不能真正任何类型的事实是......不幸的,但绝不是唯一的。还有其他情况,静态类型中没有表示隐含类型要求。例如:

  • 如果对象未实现ObjectOutputStream.writeObject(Object)Serializable方法将失败。

  • 如果数组元素未全部实现Arrays.sort(Object[])Comparable方法将失败。

我希望还有其他一些例子,其中泛型类的某些参数化没有多大意义。

答案 1 :(得分:0)

'这必须意味着它会检查路径是否可以预先访问。'是的。

hasNext()实际抓取元素,如果获取的元素为false,则返回null。{/ 1}}。

因此,当您在true之后调用next()时,它不会进行任何额外的工作,只会返回从(hasNext())元素获取的内容。

答案 2 :(得分:0)

系统正在缓冲下一个元素。这来自Javadocs:

  

由于预读,Iterator可能会在目录流关闭后返回一个或多个元素。一旦读取了这些缓冲元素,则对hasNext方法的后续调用将返回false,随后对下一个方法的调用将抛出NoSuchElementException。