我无意中发现了一段奇怪的代码,虽然我知道它在语义上意义有限,但我很好奇它是如何/为什么这样工作的。为了更清楚,这只是一个复制它的最小示例。
假设我们有以下类: Housing<T>
Cave extends Housing Animal
现在有一个方法,我们称之为 setHousing
,它接受 Class<? extends Housing<?>>
作为论据。我们想用我们的 Cave
类,例如:
setHousing(Cave.class);
但是,这会导致编译错误,如 Class<Cave>
不符合 Class<? extends Housing<?>>
,因为编译器不考虑 Cave
一个子类 Housing<?>
由于通用的 <?>
(对吗?)。
所以我们试着把这个转换成正确的类型:
setHousing((Class<Housing<?>>) Cave.class);
但这会导致另一个编译错误,即 Cannot cast from Class<Cave> to Class<Housing<?>>
. 为什么这不可能?
要想最终成功,我们需要 Object
第一:
setHousing((Class<Housing<?>>) (Object) Cave.class);
这里到底发生了什么事;i、 为什么第三个例子行得通,而第二个却不行?
暂无答案!
目前还没有任何答案,快来回答吧!