Java 为什么WatchService使用未绑定的通配符WatchEvent<&燃气轮机;而不是WatchEvent<;路径>;

Java 为什么WatchService使用未绑定的通配符WatchEvent<&燃气轮机;而不是WatchEvent<;路径>;,java,watchservice,Java,Watchservice,我只是按照这一点使用了WatchServiceAPI。我不知道为什么 使用WatchEvent而不是WatchEvent,如果使用后者,则无需强制转换,或者WatchService可以使用任何其他情况来监视非路径事件 @SuppressWarnings("unchecked") static <T> WatchEvent<T> cast(WatchEvent<?> event) { return (WatchEvent<T>)event;

我只是按照这一点使用了
WatchService
API。我不知道为什么 使用
WatchEvent
而不是
WatchEvent
,如果使用后者,则无需强制转换,或者
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);
        }
    }
}
@SuppressWarnings(“未选中”)
静态WatchEvent强制转换(WatchEvent事件){
返回(WatchEvent)事件;
}
void processEvents(){
对于(;;){
...
//为什么poolEvents()不返回WatchEvent
for(WatchEvent事件:key.pollEvents()){
WatchEvent.Kind-Kind=event.Kind();
...
//在这里,他使用静态方法cast()来抑制未检查的警告
WatchEvent ev=铸造(事件);
}
}
}
的Javadoc说:

文件系统报告事件的速度可能快于检索或处理事件的速度,而实现可能会对其累积的事件数量施加未指定的限制。如果实现有意丢弃事件,那么它会安排键的pollEvents方法返回事件类型为溢出的元素。使用者可以将此事件用作重新检查对象状态的触发器

类型为
WatchEvent.Kind
,我认为这就是为什么pollEvents需要返回
WatchEvent
列表,而不是
WatchEvent
。Javadoc for OVERFLOW还提到:

此事件的上下文是特定于实现的,可能为null

这就是为什么溢出事件的类型需要是
WatchEvent

请注意,您链接的教程提供了以下建议:

使用kind方法检索事件的类型。无论密钥注册了什么事件,都有可能接收溢出事件。您可以选择处理溢出或忽略它,但您应该测试它

因此,您应该在代码中添加以下内容(如果尚未添加):

if (kind == OVERFLOW) {
    continue;
}