簡體   English   中英

Java - 使用WatchEvent抑制未經檢查的強制轉換警告是否安全?

[英]Java - Is it safe to suppress unchecked cast warning with WatchEvent?

我有以下測試代碼:

FileSystem fs = FileSystems.getDefault();
Path conf = fs.getPath(".");
WatchKey key = null;
try {
    WatchService watcher = fs.newWatchService();
    conf.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
    while(true) {
        key = watcher.take(); // waits
        for (WatchEvent<?> event : key.pollEvents()) {

            WatchEvent.Kind<?> kind = event.kind();
            if (StandardWatchEventKinds.OVERFLOW == kind) continue;

            WatchEvent<Path> ev = (WatchEvent<Path>)event;
            Path file = ev.context();
            System.out.println(file);
        }
    }
} catch (IOException | InterruptedException e) {
    throw new RuntimeException(e.getMessage(), e);
}

編譯器發出與該行相關的unchecked cast警告

WatchEvent<Path> ev = (WatchEvent<Path>)event;

因為event來自key.pollEvents()作為WatchEvent<?> ,並且編譯器無法判斷在運行時它是否真的要包含Path ,而不是其他東西。

對此,我想知道是否有可能在沒有明確壓制它的情況下擺脫這個警告。 我找到了一些提示,雖然與完全不同的情況有關,就像這樣 ,但在這里似乎他們可以控制通用列表的構建方式,而在我的情況下,這是不可能的。

我也發現了這一點 ,他們建議抑制警告,同時檢查實際類型是否正確(因為編譯器不能單獨執行),但我無法做到在我的情況下這些線。 可能嗎? 你會怎么做?

另一方面,在我的情況下,我從使用Path對象注冊的WatchService獲取這些WatchEvent :這個事實足以證明從這個WatchService<?>出來的每個WatchEvent<?>都有一個Path類型實現? 如果這是真的,我可以安全地假設演員陣容總是正確並且禁止警告嗎? 在這種情況下,有沒有辦法避免它而沒有壓制它?

非常感謝你。

編輯

我可以立即檢查明確說明的引用

T context()

返回事件的上下文。

對於ENTRY_CREATE,ENTRY_DELETE和ENTRY_MODIFY事件,上下文是Path,它是向watch服務注冊的目錄與創建,刪除或修改的條目之間的相對路徑。

所以在我的情況下,我正在觀察ENTRY_MODIFY事件,因此我的T類型定義為Path

我認為最好的選擇就是壓制它

            @SuppressWarnings("unchecked")
            WatchEvent<Path> ev = (WatchEvent<Path>)event;

它是完全安全的,它只能是<Path>而不是別的。 API設計師有點過於籠統。

WatchService很難使用。 我有以下實用工作類,你可能會在這里

https://github.com/zhong-j-yu/bayou/blob/0.9/src/_bayou/_tmp/_FileMonitor.java

例如

_FileMonitor monitor = new _FileMonitor( ROOT_DIR );

List<Set<Path>> changes = monitor.pollFileChanges( TIMEOUT )
// return 3 sets, [0]=created, [1]=modified, [2]=deleted

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM