假设您有一个像这样的干净班级:
public class A { // Stuff }
和这样的接口:
public interface G { // Stuff }
为什么我可以这样做:
A a = new A(); ((G) a) // No errors thrown
我不明白为什么当彼此无关时,应该可以从类A转换为接口G。有人可以向我解释一下吗?
跟进。如果我进行以下操作:
public class C implements G { // Stuff }
这不会编译:
((C) a)
实现接口的类与仅实现接口的类有什么区别?
编辑:我得到一个编译器错误说:
无法从A投射到C
强制转换意味着您比编译器更了解有效内容。您正在告诉编译器关闭并按照您的指导进行操作。在某些情况下,编译器可以告诉您强制类型转换无效,但是很容易愚弄。
大多数转换通常是从Object到其他对象的,例如从非通用集合中获取对象或使用PortableRemoteObject.narrow获取远程对象时。这些强制类型转换始终会进行编译,因为强制类型转换(只要是对象而不是原始类型)始终是对象的有效子类。
参考类型转换(5.5.1)部分中的Java语言规范中有一些转换规则。如果编译器可以确定这些类之间没有关系(编译器可以告诉这些类是不同的,并且它们都不是另一个的子类),则它将拒绝强制类型转换。
添加的示例很有趣,它失败了,因为编译器具有足够的信息来指示强制类型转换无效。如果将代码更改为:
A a = new A(); G g = (G)a; Object o = a; C c = (C)o;
然后它再次编译正常(即使它同样是错误的)。