我试图做像
这样的事情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中执行此操作?
答案 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
围绕类型转换的括号是必不可少的,因为'。'运算符的优先级高于类型转换。