繁体   English   中英

Java - 使用WatchEvent抑制未经检查的强制转换警告是否安全?

[英]Java - Is it safe to suppress unchecked cast warning with WatchEvent?

我有以下测试代码:

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 ,而不是其他东西。

对此,我想知道是否有可能在没有明确压制它的情况下摆脱这个警告。 我找到了一些提示,虽然与完全不同的情况有关,就像这样 ,但在这里似乎他们可以控制通用列表的构建方式,而在我的情况下,这是不可能的。

我也发现了这一点 ,他们建议抑制警告,同时检查实际类型是否正确(因为编译器不能单独执行),但我无法做到在我的情况下这些线。 可能吗? 你会怎么做?

另一方面,在我的情况下,我从使用Path对象注册的WatchService获取这些WatchEvent :这个事实足以证明从这个WatchService<?>出来的每个WatchEvent<?>都有一个Path类型实现? 如果这是真的,我可以安全地假设演员阵容总是正确并且禁止警告吗? 在这种情况下,有没有办法避免它而没有压制它?

非常感谢你。

编辑

我可以立即检查明确说明的引用

T context()

返回事件的上下文。

对于ENTRY_CREATE,ENTRY_DELETE和ENTRY_MODIFY事件,上下文是Path,它是向watch服务注册的目录与创建,删除或修改的条目之间的相对路径。

所以在我的情况下,我正在观察ENTRY_MODIFY事件,因此我的T类型定义为Path

我认为最好的选择就是压制它

            @SuppressWarnings("unchecked")
            WatchEvent<Path> ev = (WatchEvent<Path>)event;

它是完全安全的,它只能是<Path>而不是别的。 API设计师有点过于笼统。

WatchService很难使用。 我有以下实用工作类,你可能会在这里

https://github.com/zhong-j-yu/bayou/blob/0.9/src/_bayou/_tmp/_FileMonitor.java

例如

_FileMonitor monitor = new _FileMonitor( ROOT_DIR );

List<Set<Path>> changes = monitor.pollFileChanges( TIMEOUT )
// return 3 sets, [0]=created, [1]=modified, [2]=deleted

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM