for (WatchEvent<?> event: key.pollEvents()) {
...
...
WatchEvent<Path> ev = (WatchEvent<Path>)event;
我的理解是,由于事件引用泛型类型被定义为任何扩展Object,所以它自我解释,因为Path间接扩展了Object。
但我已经在java规范上搜索了关于抛出泛型类型的任何规则,这些规则解释了上述情况和所有相关案例,但我没有找到任何内容。
首先,我的解释是对的吗? 第二,关于这个和类似的案例是否有任何参考或DOC?
答案 0 :(得分:1)
您现在正在询问此事:
WatchEvent<?> event;
WatchEvent<Path> ev = (WatchEvent<Path>)event;
这是不安全的演员。
从轮询返回的对象是无界类型。程序员&#34;知道&#34;实际的类型并且(盲目地)制作演员。
有关详细信息,请参阅JLS 5.1.10。
答案 1 :(得分:1)
由于WatchEvent<Object>
不是WatchEvent<Path>
的超类,但WatchEvent<?>
(可能被认为是WatchEvent<? extends Object>
的简写)是WatchEvent<Path>
的超类}。
虽然这一开始看似违反直觉,但有必要以这种方式使用通配符(?
)来保持泛型提供的类型安全性。
考虑将List<String>
分配给List<Object>
引用会发生什么情况。然后你将被允许add(new Object())
,违反了类型安全。
另请参阅:https://stackoverflow.com/a/2745301/7098259和https://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html