Java-使用WatchEvent禁止未经检查的强制转换警告安全吗?

Java-使用WatchEvent禁止未经检查的强制转换警告安全吗?,java,generics,casting,unchecked-cast,Java,Generics,Casting,Unchecked Cast,我有以下测试代码: FileSystem fs = FileSystems.getDefault(); Path conf = fs.getPath("."); WatchKey key = null; try { WatchService watcher = fs.newWatchService(); conf.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); while(true) {

我有以下测试代码:

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);
}
由于
event
作为
WatchEvent
key.pollEvents()
出来,编译器无法判断在运行时它是否真的包含
路径
,而不是其他内容

关于这一点,我想知道是否有可能在不明确禁止的情况下消除此警告。我发现了一些提示,虽然与非常不同的情况有关,比如,但在这里,它们似乎可以控制泛型列表的构建方式,而在我的例子中,这是不可能的

我还发现,在他们建议抑制警告的地方,同时检查实际类型是否正确(因为编译器无法自己完成),但在我的例子中,我无法按照这些思路进行操作。可能吗?你会怎么做

另一方面,在我的例子中,我从注册了
Path
对象的
WatchService
中获取这些
WatchEvent
:仅此事实就足以证明从该
WatchService
中产生的每个
WatchEvent
都将有一个
Path
类型的实现吗?如果这是真的,我是否可以安全地假设强制转换总是正确的并抑制警告?在这种情况下,有没有办法避免它而不抑制它

多谢各位

编辑 我可以立即检查,明确说明:

T上下文()

返回事件的上下文

在条目创建、条目删除和条目修改事件的情况下,上下文是一个路径,是向监视服务注册的目录与创建、删除或修改的条目之间的相对路径


因此,在我的例子中,我正在观察
ENTRY\u MODIFY
事件,因此我的
T
类型肯定是一个
路径
我认为最好的选择就是抑制它

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

Java编译器保证,如果代码编译时没有任何警告,那么它是类型安全的。因为Java中的泛型是通过擦除实现的,
在运行时不存在,并且编译器无法保证此强制转换是安全的,因此发出警告。它很可能是安全的,如果是,你应该抑制它,但这是只有你才能知道的。谢谢你的回答和建议!顺便说一句,我刚刚发现,在官方参考资料中明确指出,该类型只能是路径,正如你所指出的,我已经更新了问题。“难以使用”是一种轻描淡写的说法。我已经编写了一个300行的多线程mess来尝试应用重复数据消除和轻解析(文件删除会导致两个事件:“MODIFIED”“DELETED”,这很愚蠢,只需给我删除的事件)。再加上过度设计的接口,这就很难处理了。
            @SuppressWarnings("unchecked")
            WatchEvent<Path> ev = (WatchEvent<Path>)event;
_FileMonitor monitor = new _FileMonitor( ROOT_DIR );

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