我们经常最终在Java中使用类型转换,在这种类型转换中,我们将同一层次结构中的一个对象转换为另一个对象。
但是,我找不到任何材料来说明类型转换是如何隐式工作的。
请在这里的任何有识之士。
编辑:
我的意思是问,给出代码
超类a = new Subclass(); //不需要演员
子类b =(子类)a; //必须转换
Java如何进行从SuperClass类型到SubClass类型的类型转换。
尽管大多数帖子都说Java是自动完成的,但我还是很想知道它是自动完成的吗?
最佳答案
对于引用类型,向上转换是隐式的(或者至少我认为您是隐式的,这不是标准的Java术语)。没有隐式的向下转换。因此,如果您具有Superclass
基类和扩展了Subclass
的Superclass
类,则可以执行以下操作:
Subclass a = new Subclass();
Superclass b = a; // no cast needed.
但是,为此:
Superclass a = new Subclass(); // no cast needed
Subclass b = (Subclass) a; // cast required
请注意,通常,您在向下转换时有抛出
ClassCastException
的风险,除非您可以保证向下转换将起作用。通常使用instanceof
运算符完成此操作:Superclass a = new Subclass(); // no cast needed
Subclass b;
if (a instanceof Subclass) {
b = (Subclass) a; // cast required
} else {
// handle problem of a being a different subtype of Superclass
}
用于向上转换的标准术语正在扩展,对于向下转换的标准术语正在缩小类型。
编辑(基于对问题的编辑):
除非是以下内容,否则我不知道您引用的这些帖子是什么意思。在Java中,所有引用类型变量都只是引用。 Java执行时发生的所有事情:
Subclass b = (Subclass) a; // cast required
它是在首先检查
a
引用的对象与声明的b
类型兼容的对象之后,正在将a
中存储的引用分配给b
。 (请注意,以上内容并不表示该对象与b
具有相同的类型,它可以是子类型。)对象本身不会以任何方式转换为新的对象结构。如果您随后通过b
访问对象,则将看到通过a
对内部对象所做的任何更改(只要所做的更改会影响由a
表示的对象的更抽象的视图)。从某种意义上说,a
和b
是同一对象的别名(通常具有不同的公共api)。如果兼容性检查失败,则会出现运行时错误。如果检查无法成功,您将得到一个编译时错误。因此,您无法通过编译器获得以下信息:
String x = "Hello world";
Integer y = (Integer) x; // compiler error
当转换原始值(例如从
int
到long
)时,上述别名不会发生。在这种情况下,Java会在转换类型的机器表示中生成该值的新副本。