我们经常最终在Java中使用类型转换,在这种类型转换中,我们将同一层次结构中的一个对象转换为另一个对象。

但是,我找不到任何材料来说明类型转换是如何隐式工作的。

请在这里的任何有识之士。

编辑:

我的意思是问,给出代码
超类a = new Subclass(); //不需要演员
子类b =(子类)a; //必须转换

Java如何进行从SuperClass类型到SubClass类型的类型转换。

尽管大多数帖子都说Java是自动完成的,但我还是很想知道它是自动完成的吗?

最佳答案

对于引用类型,向上转换是隐式的(或者至少我认为您是隐式的,这不是标准的Java术语)。没有隐式的向下转换。因此,如果您具有Superclass基类和扩展了SubclassSuperclass类,则可以执行以下操作:

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表示的对象的更抽象的视图)。从某种意义上说,ab是同一对象的别名(通常具有不同的公共api)。

如果兼容性检查失败,则会出现运行时错误。如果检查无法成功,您将得到一个编译时错误。因此,您无法通过编译器获得以下信息:

String x = "Hello world";
Integer y = (Integer) x; // compiler error


当转换原始值(例如从intlong)时,上述别名不会发生。在这种情况下,Java会在转换类型的机器表示中生成该值的新副本。

08-18 06:47
查看更多