【问题标题】:How to avoid casting of a Parent's field in subclasses如何避免在子类中强制转换父字段
【发布时间】:2016-12-29 15:43:19
【问题描述】:

我的Parent 班级是这样的:

public abstract class Parent{

  protected HashMap<String, Foo> field;
  public abstract void method1();
}

现在,Parent 类的两个孩子需要遍历 HashMap 来做一些事情。第一个孩子需要Foo 类,所以没有问题。不过,第二个孩子的 method1() 是这样实现的:

@Override
public void method1(){
  for(Foo i : this.field.values(){
    ((Bar) i).specificMethod();
    /* other code */
  }
}

当然,Bar 扩展了 Foo。如您所见,强制转换以使用Bar 类的特定方法。可以通过某种方式避免这种情况吗?我知道我可以像这样在Parent 类中使用泛型:

public abstract class Parent<T extends Foo>{

  protected HashMap<String, T> field;
  /* etc. */
}

但我不知道这是否被视为不良行为。

【问题讨论】:

  • 声明地图为Map&lt;String, Bar&gt; ?,如果它包含Bars 任何方式。
  • 您的通用方法class Parent&lt;T extends Foo&gt; 很好。 prashant 的回答中还有另一种选择。我会立即更喜欢泛型,但您最好自己权衡利弊。

标签: java generics inheritance casting


【解决方案1】:

子类已经对地图的内容了如指掌。正如您所提到的,铸造是一种丑陋而狡猾的方法。将此声明移到类的通用规范中使其更加明显,并且可能是正确的方法。

【讨论】:

    【解决方案2】:

    你的 foo 类应该有一个 bar 将覆盖的方法.....所以在所有情况下你都会调用

    i.execute()

    其中 execute 是 foo 中的一个方法,它将被子类覆盖......这样做将消除将对象显式转换为子类类型的需要。

    【讨论】:

    • 感谢您的回答,但事实并非如此。 Bar 的方法不应出现在 Foo 类中。如果我正确理解您的回答,我会保留您的建议。
    猜你喜欢
    • 2021-11-06
    • 2020-12-29
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多