用于转换的 Java 规则

2022-09-01 18:32:44

什么时候可以将某个对象转换为另一个对象?投射对象是否必须是其他对象的子类型?我正试图弄清楚规则...

编辑:我意识到我根本没有解释我的问题:基本上我正在将对象转换为接口类型。但是,在运行时,我得到一个 .我的对象需要执行哪些操作才能将其转换为此接口?它必须实现它吗?java.lang.ClassCastException

谢谢


答案 1

在 Java 中,有两种类型的引用变量转换:

  • 下放:如果您有一个引用子类型对象的引用变量,则可以将其分配给子类型的引用变量。您必须进行显式强制转换才能执行此操作,结果是您可以使用此新引用变量访问子类型的成员。

  • 上放:可以显式或隐式地将引用变量分配给超类型引用变量。这是一个本质上安全的操作,因为赋值会限制新变量的访问功能。

是的,您需要直接或间接地实现接口,以便能够将类对象引用分配给接口类型。


答案 2

假设我们要将 d 对象转换为 A,

A a = (C)d;

因此,编译器和JVM在内部检查了3条规则。编译器在编译时检查前 2 个规则,JVM 在运行时检查最后一个规则。

规则 1(编译时检查):

“d”和C的类型必须具有某种关系(子项到父项或父项到子项或同一时间)。如果没有关系,那么我们将得到编译错误(不可转换的类型)。

规则 2(编译时检查):

“C”必须是“A”的相同类型或派生类型(子类),否则我们将得到编译错误(不兼容的类型)。

规则 3(运行时异常):

运行时对象类型“d”必须与“C”类型相同或派生为“C”类型,否则我们将得到运行时异常(ClassCastException Exception)。

查找以下示例以获取更多想法,

String s = new String("hello"); StringBuffer sb = (StringBuffer)s;  // Compile error : Invertible types because there is no relationship between.

Object o = new String("hello"); StringBuffer sb = (String)o;       // Compile error : Incompatible types because String is not child class of StringBuffer.

Object o = new String("hello"); StringBuffer sb = (StringBuffer)o; // Runtime Exception : ClassCastException because 'o' is string type and trying to cast into StingBuffer and there is no relationship between String and StringBuffer.