我有以下测试代码:
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;
因为作为 a 出现event,编译器无法判断在运行时它是否真的包含 a ,而不是其他东西。key.pollEvents()WatchEvent<?>Path
关于这一点,我想知道是否有可能在不明确禁止它的情况下摆脱这个警告。我发现了一些提示,虽然与完全不同的情况有关,比如this,但在这里他们似乎可以控制通用列表的构建方式,而在我的情况下这是不可能的。
我也发现了这一点,他们建议抑制警告,同时检查实际类型是否正确(因为编译器不能自己做),但我无法做到在我的情况下这些行。是否可以?你会怎么做?
另一方面,在我的例子中,我是WatchEvent从一个WatchService注册的Path对象中得到这些的:仅这个事实就足以证明每WatchEvent<?>一个由此而来的WatchService<?>都会有一个Path类型实现吗?如果这是真的,我可以安全地假设演员表总是正确的并抑制警告吗?在这种情况下,有没有办法避免它而不抑制它?
非常感谢你。
编辑
我本可以立即检查明确指出的参考文献:
上下文()
返回事件的上下文。
在 ENTRY_CREATE、ENTRY_DELETE 和 ENTRY_MODIFY 事件的情况下,上下文是一个 Path,它是向监视服务注册的目录与创建、删除或修改的条目之间的相对路径。
所以就我而言,我正在关注ENTRY_MODIFY事件,因此我的T类型绝对是Path.