让两个类定义如下:
Class A{
int a;
}
Class B{
int b;
}
A和B是两个不相关的类。无论如何我可以将A的对象投射到B?如果是,请解释我的各种选择。
答案 0 :(得分:1)
你可以做到
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);
答案 1 :(得分:1)
您可以向普通超级类型进行向上播种,然后进行向下广播
(Dog)(Pet)aCat
当然,Object
是任何类型的超类型,因此我们可以使用它在任何两种类型之间进行转换
(Apple)(Object)aCat
通常,这没有任何意义,它会导致运行时异常。但它在一些通用案例中可能会有所帮助。例如,Supplier<Integer>
和Supplier<number>
是&#34;无关&#34 ;;事实上,它们是相互排斥的,即交集是空的,或者,任何对象都不能同时属于这两种类型。尽管如此,我们可能希望将Supplier<Integer>
转换为Supplier<Number>
,因为Java中存在差异,并且存在擦除。请参阅此case study。
答案 2 :(得分:0)
你不能。这将破坏面向对象编程的基本原则。
答案 3 :(得分:0)
虽然JAVA允许您在不相关的类中键入强制转换对象,即不在类层次结构中。由于以下情况,这是允许的
String s = (String)list.get(1);
井列表当然可以包含不同类型的对象,并且在调用这样的方法时它也可以返回String。
提出你的问题,你将成功进行类型转换,但在运行时你会得到ClassCastException
。
您可以键入强制转换对象B来键入A iff B IS-A A
,这意味着B是A的子类型。如果两者都不在层次结构中,那么输入它们没有意义。就像您无法将Animal
类型转换为Furniture
类型一样。