6

次のテストコードがあります。

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

これに関して、明示的に抑制せずにこの警告を取り除くことができるかどうか疑問に思っていました. thisのように、まったく異なる状況に関連していますが、いくつかのヒントを見つけましたが、ここでは、一般的なリストの構築方法を制御できるようですが、私の場合はこれは不可能です。

私はまた、警告を抑制することを提案し、実際の型が正しい型であるかどうかを同時にチェックすることを提案している this を見つけまし(コンパイラはそれを単独で行うことができないため)。私の場合、これらの行。出来ますか?どのようにしますか?

一方、私の場合、オブジェクトに登録されたものWatchEventからこれらを取得しています。この事実だけで、これから出てくるすべてのものが型の実装を持つことを証明するのに十分ですか? これが本当なら、キャストが常に正しく、警告を抑制すると安全に想定できますか? この場合、それを抑制せずに回避する方法はありますか?WatchServicePathWatchEvent<?>WatchService<?>Path

どうもありがとうございました。

編集

次のことを明示的に述べている参照をすぐに確認できたはずです。

T コンテキスト()

イベントのコンテキストを返します。

ENTRY_CREATE、ENTRY_DELETE、および ENTRY_MODIFY イベントの場合、コンテキストは、watch サービスに登録されたディレクトリと、作成、削除、または変更されたエントリとの間の相対パスである Path です。

したがって、私の場合、ENTRY_MODIFYイベントを監視しているため、私のTタイプは明らかに aPathです。

4

1 に答える 1

4

抑えるのが一番だと思います

            @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
于 2015-05-11T21:15:23.533 に答える