我在java oracle教程中遇到了这种类型的转换
for (WatchEvent<?> event: key.pollEvents()) {
...
...
WatchEvent<Path> ev = (WatchEvent<Path>)event;
我的理解是,由于事件引用泛型类型被定义为任何扩展对象的东西,所以它是自我解释的,因为路径间接扩展了对象。
但是我已经在java规范上搜索了有关解释上述情况和所有相关情况的任何转换泛型类型的规则,但我没有找到任何东西。
首先,我的解释是否正确?其次,关于这个和类似的案例,是否有任何参考或DOC?
你问这个:
WatchEvent<?> event;
WatchEvent<Path> ev = (WatchEvent<Path>)event;
这是一个不安全的演员表。
从轮询返回的对象是无界类型。程序员"知道"实际类型并(盲目地)制作了演员表。
有关更多详细信息,请参阅 JLS 5.1.10。
因为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