我见过DirectoryStream
的唯一用法是使用Path
类型作为其类型参数DirectoryStream<Path>
来自Files.newDirectoryStream(Path)
。
此外,由于documentation中的以下陈述,我不明白为什么它允许任何类型:
如果hasNext方法返回true,然后调用下一个方法,则可以保证下一个方法不会因I / O错误而抛出异常,或者因为流已经关闭。
这必须意味着它会检查Path
是否可以预先访问,因此不能是通用类型。
答案 0 :(得分:3)
为什么
java.nio.file.DirectoryStream
使用无限制的泛型?我见过
DirectoryStream
的唯一用法是使用Path
类型作为其类型参数DirectoryStream<Path>
来自Files.newDirectoryStream(Path)
。
如果您查看SecureDirectoryStream
,该界面会使用无界通用扩展DirectoryStream
。但是,SecureDirectoryStream
的唯一具体实现也使用Path
参数化。
所以,最合理的解释是:
File
的目录流,但它已被放弃......为时尚晚,无法完全摆脱参数。无论哪种方式,该参数目前都是无害的异常。
这必须意味着它会检查Path是否可以预先访问,因此不能是泛型类型。
该参数可能是无限制的,因为Path
和File
没有合适的公共超级接口。它不能真正任何类型的事实是......不幸的,但绝不是唯一的。还有其他情况,静态类型中没有表示隐含类型要求。例如:
如果对象未实现ObjectOutputStream.writeObject(Object)
,Serializable
方法将失败。
如果数组元素未全部实现Arrays.sort(Object[])
,Comparable
方法将失败。
我希望还有其他一些例子,其中泛型类的某些参数化没有多大意义。
答案 1 :(得分:0)
'这必须意味着它会检查路径是否可以预先访问。'是的。
hasNext()
实际抓取元素,如果获取的元素为false
,则返回null
。{/ 1}}。
因此,当您在true
之后调用next()
时,它不会进行任何额外的工作,只会返回从(hasNext()
)元素获取的内容。
答案 2 :(得分:0)
系统正在缓冲下一个元素。这来自Javadocs:
由于预读,Iterator可能会在目录流关闭后返回一个或多个元素。一旦读取了这些缓冲元素,则对hasNext方法的后续调用将返回false,随后对下一个方法的调用将抛出NoSuchElementException。