【问题标题】:can you downcast objects in java without declaring a new variable?您可以在不声明新变量的情况下在 java 中向下转换对象吗?
【发布时间】:2011-01-31 05:41:07
【问题描述】:

我正在尝试做类似的事情

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中做到这一点?

【问题讨论】:

  • 正如@Leon 指出的那样,如果您以后(在同一范围内)需要xyz 的类型为E,您永远不会写O xyz = new E(),而是声明正确的类型@987654328 @。但我假设你的真实代码比这个例子更难。

标签: java inheritance object polymorphism downcast


【解决方案1】:

是的,你可以低调

((E)xyz).method();

【讨论】:

  • 这不是 OP 所要求的。 OP 在问,“我可以向下转换并重新分配回原始变量吗?”这和问“我可以在声明后重新定义变量的类型吗?”是一样的。
【解决方案2】:

不,声明后不能更改变量的类型。

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

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

不过,如果您需要多次创建新变量,则应该创建一个新变量。编译器可能足够聪明,也可能不够聪明,否则无法正确优化(并且您会产生重复类转换的运行时开销)。

【讨论】:

  • 这就是答案
【解决方案3】:

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

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

这是多态性

【讨论】:

  • 但是,他说事实并非如此。只有子类有他要调用的方法。
  • 那么他应该只声明 E xyz = new E() 或在 O 中创建一个抽象方法 xyz。这个问题的标签是多态性,这将是我的多态行为
  • 那(将变量声明为他实际需要的类型)将是最好的方法。不过,我假设这是一个简化的示例。
【解决方案4】:

你不能这样做:

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

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

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

但是,您可以这样做:

((E) xyx).someEMethod(); // fine

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2021-12-11
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多