我知道转换实际上只能从子类到超类(向上转换),但这个例子说明了我想做的事情。
Class Super {}
Class Sub extends Super {}
Super super = new Super();
Sub sub = (Sub)super;
我认为这被称为“向下”施放,这是不允许的......
在给定Super类型的对象的情况下,创建Sub类型对象的最佳方法是什么。
编辑:
这就是问题 - 将动物转换为猫的最佳方法是什么。
答案是什么?从基类型动物开始,将属性复制到cat。添加毛发和尾巴等基本上是一个复制构造函数。这是正确的答案(或一个好的答案)吗?
另一个编辑:
我认为我的问题很清楚但也许它太笼统了。要求采用“最佳”方式做某事往往会产生很多不同的反应。我意识到在不同情况下,最佳方式可能会有所不同。
我不是在寻找有关Java或OO基础知识的教程。只是捕获意见所以我可以解决这个问题,因为我已经使用最佳实践概述了它。
答案 0 :(得分:9)
Cat
是Animal
。
如果我给你一只动物(不一定是猫),你怎么把它变成猫?
编辑:
几乎可以做任何事情。大多数时候,你不应该。我相信更好的设计将消除向下转型的需要。但你可以:
在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;
我在这里做了一个非常基本的例子,但你可以随心所欲地去任何你想要的地方,你可以让它像继承一样工作。并且它不会发回任何错误。