我只是按照此tutorial使用WatchService
API。我不知道为什么
使用WatchEvent<?>
而非WatchEvent<Path>
,如果我使用后者,则无需投射,或WatchService
可用于监控非路径事件的任何其他情况
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
void processEvents() {
for (; ; ) {
...
//why doesn't the poolEvents() return WatchEvent<Path>
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
...
//here he use a static method cast() to SuppressWarnings the unchecked warning
WatchEvent<Path> ev = cast(event);
}
}
}
答案 0 :(得分:3)
WatchService的Javadoc说:
文件系统可以比检索或处理事件更快地报告事件,并且实现可能会对可能累积的事件数量施加未指定的限制。如果实现有意丢弃事件,则它会安排密钥的pollEvents方法返回事件类型为OVERFLOW的元素。消费者可以使用此事件作为重新检查对象状态的触发器。
StandardWatchEventKinds.OVERFLOW的类型为WatchEvent.Kind<Object>
,我认为这是pollEvents需要返回WatchEvent<?>
而不是WatchEvent<Path>
的列表的原因。 OVERFLOW的Javadoc也提到:
此事件的上下文是特定于实现的,可能为null
这就是溢出事件的类型必须是WatchEvent<Object>
的原因。
请注意,您链接的教程建议如下:
使用kind方法检索事件类型。无论密钥注册的是什么事件,都可以收到OVERFLOW事件。您可以选择处理溢出或忽略它,但您应该测试它。
因此,您应该在代码中添加以下内容(如果您还没有):
if (kind == OVERFLOW) {
continue;
}