强制转换意味着您比编译器更了解有效内容。您正在告诉编译器关闭并按照您的指导进行操作。在某些情况下,编译器可以告诉您强制类型转换无效,但是很容易愚弄。
大多数转换通常是从Object到其他对象的,例如从非通用集合中获取对象或使用PortableRemoteObject.narrow获取远程对象时。这些强制类型转换始终会进行编译,因为强制类型转换(只要是对象而不是原始类型)始终是对象的有效子类。
参考类型转换(5.5.1)部分中的Java语言规范中有一些转换规则。如果编译器可以确定这些类之间没有关系(编译器可以告诉这些类是不同的,并且它们都不是另一个的子类),则它将拒绝强制类型转换。
添加的示例很有趣,它失败了,因为编译器具有足够的信息来指示强制类型转换无效。如果将代码更改为:
A a = new A(); G g = (G)a; Object o = a; C c = (C)o;
然后它再次编译正常(即使它同样是错误的)。



