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

Mat*_*hew 12 java oop

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

Class Super {}
Class Sub extends Super {}

Super super = new Super();
Sub sub = (Sub)super;
Run Code Online (Sandbox Code Playgroud)

我相信这被称为"向下"铸造,这是不允许的......

给定Super类型的对象,创建Sub类型对象的最佳方法是什么.

编辑:

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

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

另一个编辑:

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

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

Luc*_*ore 9

A Cat是一个Animal.

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

编辑:

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

  • 有一个构造函数,Super它采用Subas参数.

  • 实现一个工厂,Super并有一个带Sub参数的方法.

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

  • @Matthew - 只是因为有办法做到这一点,并不意味着你应该这样做.你想要实现的静态更好.倾斜很少是答案,我99%肯定在你的情况下存在更好的解决方案. (2认同)

kuf*_*ufi 6

如果实际对象的类型为"Sub",则只能向下转换.例如:

Super subAsSuper = new Sub();
Sub sub = (Sub)subAsSuper
Run Code Online (Sandbox Code Playgroud)

你的方式不会起作用,因为super不是sub的子类.所以你会得到运行时错误.


Div*_*vya 5

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