用于转换的 Java 规则
什么时候可以将某个对象转换为另一个对象?投射对象是否必须是其他对象的子类型?我正试图弄清楚规则...
编辑:我意识到我根本没有解释我的问题:基本上我正在将对象转换为接口类型。但是,在运行时,我得到一个 .我的对象需要执行哪些操作才能将其转换为此接口?它必须实现它吗?java.lang.ClassCastException
谢谢
什么时候可以将某个对象转换为另一个对象?投射对象是否必须是其他对象的子类型?我正试图弄清楚规则...
编辑:我意识到我根本没有解释我的问题:基本上我正在将对象转换为接口类型。但是,在运行时,我得到一个 .我的对象需要执行哪些操作才能将其转换为此接口?它必须实现它吗?java.lang.ClassCastException
谢谢
在 Java 中,有两种类型的引用变量转换:
下放:如果您有一个引用子类型对象的引用变量,则可以将其分配给子类型的引用变量。您必须进行显式强制转换才能执行此操作,结果是您可以使用此新引用变量访问子类型的成员。
上放:可以显式或隐式地将引用变量分配给超类型引用变量。这是一个本质上安全的操作,因为赋值会限制新变量的访问功能。
是的,您需要直接或间接地实现接口,以便能够将类对象引用分配给接口类型。
假设我们要将 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.