设两个类定义如下:
Class A{
int a;
}
Class B{
int b;
}
A和B是两个不相关的类。无论如何我可以将 A 的对象投射到 B 吗?如果是,请解释一下我有的各种选择。
你可以做
Object b = new B();
A a = (A) b;
但是这会在运行时抛出 ClassCastException。
您可以使用复制构造函数
class B {
public B(A a) { ... }
public static B toB(A a) { return new B(a); }
}
然后你就可以做
B b = new B(a);
或
B b = toB(a);
您可以向上转换为常见的超级类型,然后向下转换
(Dog)(Pet)aCat
当然,
Object
是任何类型的超类型,因此我们可以使用它在任意两种类型之间进行转换
(Apple)(Object)aCat
通常,这是没有意义的,并且会导致运行时异常。但在某些一般情况下它可能会有所帮助。例如,
Supplier<Integer>
和Supplier<number>
是“不相关的”;事实上,它们是互斥的,即交集为空,或者说,没有对象可以同时属于这两种类型。尽管如此,由于 Java 缺乏方差,再加上擦除的存在,我们可能希望将 Supplier<Integer>
转换为 Supplier<Number>
。请参阅此案例研究。
你不能。这将打破面向对象编程的基本原则。
尽管 JAVA 允许您跨不相关的类(即不在类层次结构中)键入强制转换对象。由于以下情况,这是允许的
String s = (String)list.get(1);
列表当然可以包含不同类型的对象,并且在调用此类方法时它也可以返回 String。
回答你的问题,你将成功进行类型转换,但在运行时你会得到
ClassCastException
。
您可以将对象 B 类型转换为 A 类型,当且仅当
B IS-A A
这意味着 B 是 A 的子类型。如果两者不在层次结构中,则对它们进行类型转换没有意义。就像您不能将 Animal
类型转换为 Furniture
类型一样。