如何在Java中访问特定的子类方法?

时间:2012-04-22 18:46:04

标签: java arraylist

您好我有一个属性类和2个子类购物公寓

在另一个班级,我有一个商店和公寓混合的arraylist。我有代码:

for(Property prop: properties){
  if(prop.getClass().equals(Shop.class))
       prop.setShopDetails(detail);
  else
       prop.setAppDetails(detail)
}

如何在商店类中访问方法setShopDetails()?

3 个答案:

答案 0 :(得分:6)

您需要将prop投射到Shop

for(Property prop: properties){
  if(prop.getClass().equals(Shop.class))
       ((Shop) prop).setShopDetails(detail);
  else
       ((Apartment) prop).setAppDetails(detail)
  }
}

然而,更好的方法是在setDetails类中定义抽象方法Property,并在每个子类中以不同方式实现它。您可能还想使用prop instanceof Shop代替prop.getClass().equals(Shop.class)

答案 1 :(得分:2)

首先,考虑propShop的子类的情况。你的if条件会返回false!这是使用instanceof operator的最佳时机。

要访问这些方法,您需要将对象转换为正确的子类:

if(prop instanceof Shop) {
    Shop s = (Shop) prop;
    s.setShopDetails(details);
} else {
    // you get the idea
}

但是,这种方式违背了多态性的目的。为什么不在setDetails中创建Property方法并允许子类处理它们的方式呢?

答案 2 :(得分:0)

首先,在这种情况下你必须调用getClass()这一事实通常表明设计错误。您可能希望有一个被子类覆盖的abstract setDetails方法。

您正在寻找的语言功能是“投射”。在调用子类方法之前,您希望像{so}那样强制转换Property

((Shop)prop).getShopDetails(detail);