你可以在不声明新变量的情况下向下转换java中的对象吗?

时间:2011-01-31 05:41:07

标签: java inheritance object polymorphism downcast

我试图做像

这样的事情
class O has a child E

我宣布变量

O xyz = new E();

但是如果我调用xyz.method(),我只能调用类O的方法,而不是E,所以我可以通过

来调用它。
E xyz2 = (E) xyz;

我的问题是 - 你能否在不声明新变量的情况下这样做?类似的东西:

O xyz = new E();
xyz = (E) xyz; 

现在我可以使用xyz.method()来调用E的方法

有没有办法在java中执行此操作?

4 个答案:

答案 0 :(得分:7)

是的,你可以垂头丧气

((E)xyz).method();

答案 1 :(得分:1)

不,在声明变量后,您无法更改变量的类型。

您可以内联类型转换,如果您只需要向下转换一次,可以节省一些输入:

Number n = 1;
((Integer)n).someIntegerMethod();

如果您需要多次执行此操作,则应该创建一个新变量。编译器可能也可能不够聪明,否则不能正确地优化它(并且会导致重复类转换的运行时开销)。

答案 2 :(得分:0)

如果父类(O)也有方法xyz,你可以调用

O xyz = new E();
xyz.method();   // E's xyz would be called

这是多态性

答案 3 :(得分:0)

你不能这样做:

O xyz = new E();
xyz = (E) xyz; 
xyx.someEMethod(); // compilation error

原因是Java对象的类型转换实际上并没有改变任何值。相反,它们针对对象的实际类型执行类型检查。

您的代码检查xyz的值是否为E,然后将类型转换的结果分配回xyz(第二个语句),从而将其向上转发回{ {1}}再次。

但是,你可以这样做:

O

围绕类型转换的括号是必不可少的,因为'。'运算符的优先级高于类型转换。