您可以在java中向下转换对象而不声明新变量吗?
我试着做一些类似的事情您可以在java中向下转换对象而不声明新变量吗?,java,inheritance,object,polymorphism,downcast,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中有这样做的方法吗?是的,您可以使用down
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中有这样做的方法吗?是的,您可以使用downcast
((E)xyz).method();
如果父类(O)也有一个方法xyz,则可以调用
O xyz = new E();
xyz.method(); // E's xyz would be called
这是多态性否,您不能在声明变量后更改其类型 您可以内联类型转换,如果只需要向下转换一次,则可以节省一些输入:
Number n = 1;
((Integer)n).someIntegerMethod();
但是,如果需要多次创建新变量,则可能需要创建一个新变量。编译器可能足够聪明,也可能不够聪明,无法正确地对此进行优化(这样会导致重复类转换的运行时开销)。您不能这样做:
O xyz = new E();
xyz = (E) xyz;
xyx.someEMethod(); // compilation error
原因是Java对象的类型转换实际上不会更改任何值。相反,它们根据对象的实际类型执行类型检查
您的代码检查xyz
的值是否为E
,但随后将类型转换的结果分配回xyz
(第二条语句),从而再次将其向上转换回O
但是,您可以这样做:
((E) xyx).someEMethod(); // fine
typecast周围的括号是必不可少的,因为“.”运算符的优先级高于typecast。然而,他说情况并非如此。只有子类有他想要调用的方法。然后他应该只声明E xyz=new E(),或者在O中创建一个抽象方法xyz。这个问题的标签是多态性,这将显示多态性行为(将变量声明为他实际需要的类型)将是最好的方法。不过,我假设这是一个简化的例子。正如@Leon指出的,如果您以后(在同一范围内)需要
xyz
类型为E
,您将永远不会编写O xyz=newe()
,而是声明正确的类型E xyz=newe()
。但我假设你的真实代码比这个例子更难,但这不是OP要问的。OP在问“我可以向下转换并重新分配回原始变量吗?”这与问“我可以在声明后重新定义变量的类型吗?”是相同的答案