为什么WatchService使用未绑定的通配符WatchEvent <! - ? - >而不是WatchEvent <path> </path>

时间:2014-06-29 15:36:45

标签: java watchservice

我只是按照此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);
        }
    }
}

1 个答案:

答案 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;
}