2017-01-15 70 views
1

我見過的DirectoryStream的唯一用法是使用Path作爲它的類型參數,DirectoryStream<Path>來自Files.newDirectoryStream(Path)爲什麼java.nio.file.DirectoryStream使用無限泛型?

另外,我不明白爲什麼它可以讓因爲在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是否可以預先訪問,因此不能是泛型類型。

該參數可能是無界的,因爲PathFile沒有合適的通用超級接口。事實上,它不能真的是任何類型是......不幸的,但決不是唯一的。還有其他一些情況下,靜態類型中沒有表達隱含的類型要求。例如:

  • 如果對象沒有實現SerializableObjectOutputStream.writeObject(Object)方法失敗。

  • 如果數組元素不全都實現Comparable,則Arrays.sort(Object[])方法失敗。

我希望還有其他的例子,其中泛型類的一些參數化沒有多大意義。

0

'這意味着它會檢查Path是否可以預先訪問。'是的。

hasNext()實際提取元素並返回false如果提取的元素是null否則true

因此,當您撥打next()hasNext(),它不會付出任何額外的努力,但只是返回提取(取自hasNext())元素。

0

系統正在緩衝下一個元素。來自Javadocs:

由於預讀,Iterator可能會在目錄流關閉後返回一個或多個元素。一旦讀取了這些緩衝元素,隨後對hasNext方法的調用返回false,隨後對下一個方法的調用將拋出NoSuchElementException。

相關問題