用于投射的Java规则

ala*_*lan 23 java casting object

何时可以将某个对象转换为另一个对象?铸造对象是否必须是另一个对象的子类型?我正试图找出规则......

编辑:我意识到我根本没有解释我的问题:基本上我正在将一个对象转换为接口类型.但是,在运行时,我得到了一个java.lang.ClassCastException.我的对象需要发生什么才能将其转换为此接口?是否必须实施它?

谢谢

cod*_*ict 31

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

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

  • 上传:您可以显式或隐式地将引用变量分配给超类型引用变量.这是一种固有的安全操作,因为赋值限制了新变量的访问能力.

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


小智 5

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

a a =(C)d;

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

规则1(编译时间检查):

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

规则2(编译时间检查):

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

规则3(运行时异常):

运行时对象类型“ d”必须相同或派生为“ 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.
Run Code Online (Sandbox Code Playgroud)


Ano*_*on. 2

如果对象的运行时类型是您尝试将其转换为的类型的子类型,则可以进行转换。

编辑:

是的,您尝试转换的对象需要实现该接口才能成功转换它。