如何避免在子类中转换Parent的字段

时间:2016-12-29 15:43:19

标签: java generics inheritance casting

我的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类中使用Generics,如下所示:

public abstract class Parent<T extends Foo>{

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

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

2 个答案:

答案 0 :(得分:2)

儿童班已经对地图内容有了深入的了解。正如你所提到的,铸造是一种丑陋而狡猾的方法。将此声明移动到类的通用规范使得它更加明显,并且可能是正确的方法。

答案 1 :(得分:1)

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

i.execute()

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