为什么在类对象中进行转换时需要将对象转换为对象?

时间:2016-05-10 13:03:55

标签: java generics casting

我偶然发现了一段奇怪的代码,虽然我知道它在语义上有限,但我很好奇它是如何/为什么以这种方式工作的。 为了更加清晰,这只是一个复制它的最小例子。

假设我们有以下类:

  • Housing<T>
  • Cave<T extends Animal> extends Housing<T>
  • Animal

现在有一个方法,我们称之为setHousing,它接受​​Class<? extends Housing<?>>作为参数。 我们希望使用我们的Cave类来调用它,例如像这样:

setHousing(Cave.class);

但是,这会导致编译错误,因为Class<Cave>不符合Class<? extends Housing<?>>,因为编译器并不认为CaveHousing<?>的子类由于通用<?>(对吗?)。

因此我们尝试将此类型转换为正确的类型:

setHousing((Class<Housing<?>>) Cave.class);

但这会导致另一个编译错误,声称Cannot cast from Class<Cave> to Class<Housing<?>>。为什么这不可能?

要最终使其正常工作,我们需要先转换为Object

setHousing((Class<Housing<?>>) (Object) Cave.class);

这到底是怎么回事;即为什么第三个例子有效,但第二个例子没有?

0 个答案:

没有答案