转换泛型类型对象

时间:2017-01-01 12:10:58

标签: java generics

我在java oracle tutorial

上遇到了这种类型的投射
 for (WatchEvent<?> event: key.pollEvents()) {
...
...
 WatchEvent<Path> ev = (WatchEvent<Path>)event;

我的理解是,由于事件引用泛型类型被定义为任何扩展Object,所以它自我解释,因为Path间接扩展了Object。

但我已经在java规范上搜索了关于抛出泛型类型的任何规则,这些规则解释了上述情况和所有相关案例,但我没有找到任何内容。

首先,我的解释是对的吗? 第二,关于这个和类似的案例是否有任何参考或DOC?

2 个答案:

答案 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/7098259https://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html