将超类的对象转换为子类 - 向下转换

时间:2012-01-06 12:53:35

标签: java oop

我知道转换实际上只能从子类到超类(向上转换),但这个例子说明了我想做的事情。

Class Super {}
Class Sub extends Super {}

Super super = new Super();
Sub sub = (Sub)super;

我认为这被称为“向下”施放,这是不允许的......

在给定Super类型的对象的情况下,创建Sub类型对象的最佳方法是什么。

编辑:

这就是问题 - 将动物转换为猫的最佳方法是什么。

答案是什么?从基类型动物开始,将属性复制到cat。添加毛发和尾巴等基本上是一个复制构造函数。这是正确的答案(或一个好的答案)吗?

另一个编辑:

我认为我的问题很清楚但也许它太笼统了。要求采用“最佳”方式做某事往往会产生很多不同的反应。我意识到在不同情况下,最佳方式可能会有所不同。

我不是在寻找有关Java或OO基础知识的教程。只是捕获意见所以我可以解决这个问题,因为我已经使用最佳实践概述了它。

5 个答案:

答案 0 :(得分:9)

CatAnimal

如果我给你一只动物(不一定是猫),你怎么把它变成猫?

编辑:

几乎可以做任何事情。大多数时候,你不应该。我相信更好的设计将消除向下转型的需要。但你可以:

  • Super中有一个构造函数,其中Sub为参数。

  • 实施Super的工厂,并且有一个以Sub为参数的方法。

我建议你扩展你的问题,告诉我们你需要什么,因为我认为存在一个更优雅的解决方案。

答案 1 :(得分:6)

如果实际对象的类型为“Sub”,则只能向下转播。 例如:

Super subAsSuper = new Sub();
Sub sub = (Sub)subAsSuper

你的方式不起作用,因为super不是sub的子类。因此,您将收到运行时错误。

答案 2 :(得分:5)

您可以在Sub类中添加一个构造函数,该类将Super个对象作为参数。

答案 3 :(得分:1)

编辑:从你的问题来看,你知道什么和你不知道什么都不清楚。所以当人们回答

时不要感到惊讶
  

我认为这被称为“向下”施放,这是不允许的

部分而不是(非常模糊)“实际问题”。

是的,复制构造函数就是这样。

不,它不是唯一的,工厂方法会做得很好。

不,这不是最好的 - 我们不知道你有什么约束和假设。


旧版本: 可以通过任何一种方式进行转换,通常不需要向上转换(除非您需要选择特定的重载方法)。

除了创建一个基于给定数据的数据构建新对象的方法之外,通常没有办法创建Sub类型的对象给定Super 类型的对象。

要进行强制转换,您必须确保您正在投射的对象实际上是您投射到的对象(或其子类型)。

答案 4 :(得分:0)

记住这个想法 -

Class Super {}
Class Sub {
    public Super super = new Super();
}

Sub sub = new Sub();
sub.super = super;

我在这里做了一个非常基本的例子,但你可以随心所欲地去任何你想要的地方,你可以让它像继承一样工作。并且它不会发回任何错误。