在JAVA中键入不相关类之间的转换

时间:2015-09-16 20:12:53

标签: java casting

让两个类定义如下:

Class A{
    int a;
}

Class B{
    int b;
}

A和B是两个不相关的类。无论如何我可以将A的对象投射到B?如果是,请解释我的各种选择。

4 个答案:

答案 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类型一样。

相关问题