不相关类之间的类型转换

问题描述 投票:0回答:4

设两个类定义如下:

Class A{
    int a;
}

Class B{
    int b;
}

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

java casting
4个回答
2
投票

你可以做

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
投票

您可以向上转换为常见的超级类型,然后向下转换

    (Dog)(Pet)aCat

当然,

Object
是任何类型的超类型,因此我们可以使用它在任意两种类型之间进行转换

    (Apple)(Object)aCat

通常,这是没有意义的,并且会导致运行时异常。但在某些一般情况下它可能会有所帮助。例如,

Supplier<Integer>
Supplier<number>
是“不相关的”;事实上,它们是互斥的,即交集为空,或者说,没有对象可以同时属于这两种类型。尽管如此,由于 Java 缺乏方差,再加上擦除的存在,我们可能希望将
Supplier<Integer>
转换为
Supplier<Number>
。请参阅此案例研究


0
投票

你不能。这将打破面向对象编程的基本原则。


0
投票

尽管 JAVA 允许您跨不相关的类(即不在类层次结构中)键入强制转换对象。由于以下情况,这是允许的

String s = (String)list.get(1);

列表当然可以包含不同类型的对象,并且在调用此类方法时它也可以返回 String。

回答你的问题,你将成功进行类型转换,但在运行时你会得到

ClassCastException

您可以将对象 B 类型转换为 A 类型,当且仅当

B IS-A A
这意味着 B 是 A 的子类型。如果两者不在层次结构中,则对它们进行类型转换没有意义。就像您不能将
Animal
类型转换为
Furniture
类型一样。

© www.soinside.com 2019 - 2024. All rights reserved.