我想对一个对象强制向下转换,这是不能被强制转换的,并且想知道正确的方法是什么。
用例是我有一个被检查的规则列表,什么将生成失败的规则列表。失败的规则是规则的子类。但是像
FailedRule failedRule =(FailedRule)规则;

将失败,因为规则对象不是FailedRule的实例

为了解决这个问题,我实例化了一个克隆。
FailedRule failedRule =新的FailedRule(规则);

我的FailedRule类看起来像这样

public class FailedRule extends Rule{

/*
 *force a down cast from Rule to FailedRule through cloning
*/
public FailedRule (Rule upcast){
   super.setRuleCode( upcast.getRuleCode());
   super.setType(upcast.getType());
   ..

有没有更简单的方法可以做到这一点?
要回答我自己,设计有缺陷,代码应为:
public class FailedRule{
  private Rule rule;
  ..
  public setRule(Rule rule){
  ..

最佳答案

这可能是您的继承层次结构设计薄弱的征兆。您正在尝试通过继承引入属性的可变性(如果RuleFailedRule的实例,则failed已“失败”)。继承对于这种事情并不是很有益。

我会说您应该使用composition(FailedRule具有Rule作为源)或Rule应该是ojit_code实例的布尔属性。

08-04 22:13