我偶然发现了一段奇怪的代码,虽然我知道它在语义上有限,但我很好奇它是如何/为什么以这种方式工作的。 为了更加清晰,这只是一个复制它的最小例子。
假设我们有以下类:
Housing<T>
Cave<T extends Animal> extends Housing<T>
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);
这到底是怎么回事;即为什么第三个例子有效,但第二个例子没有?