次のテストコードがあります。
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
からこれらを取得しています。この事実だけで、これから出てくるすべてのものが型の実装を持つことを証明するのに十分ですか? これが本当なら、キャストが常に正しく、警告を抑制すると安全に想定できますか? この場合、それを抑制せずに回避する方法はありますか?WatchService
Path
WatchEvent<?>
WatchService<?>
Path
どうもありがとうございました。
編集
次のことを明示的に述べている参照をすぐに確認できたはずです。
T コンテキスト()
イベントのコンテキストを返します。
ENTRY_CREATE、ENTRY_DELETE、および ENTRY_MODIFY イベントの場合、コンテキストは、watch サービスに登録されたディレクトリと、作成、削除、または変更されたエントリとの間の相対パスである Path です。
したがって、私の場合、ENTRY_MODIFY
イベントを監視しているため、私のT
タイプは明らかに aPath
です。