首页 > 解决方案 > 如何使此方法更通用

问题描述

我在确定有关 Java 继承的问题时遇到了一些麻烦。我认为这很简单,但它难倒了我。

我有这个超类..

public class MyItem {

    private String barCode;
    private String price;

    public String getBarCode() {
        return barCode;
    }

    public void setBarCode(String barCode) {
        this.barCode = barCode;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

}

我有这两个子类

public class PromotionalItem extends MyItem {

    private String promotion;

    public String setPromotion(String promotion) {
        this.promotion = promotion;
    }

    public void getPromotion() {
        this.promotion = promotion;
    }

}

public class SellableItem extends MyItem {

    private String quantity;

    public String setQuantity(String quantity) {
        this.quantity = quantity;
    }

    public void getQuantity() {
        this.quantity = quantity;
    }

}

现在我有一个我想要通用的方法,我认为这样的东西可以工作......

public void processItem(MyItem item){
    if(item.getClass().isAssignableFrom(PromotionalItem.class)){
        processPromotionalItem((PromotionalItem)item);
    }
    else{
        processSellableItem((SellableItem)item);
    }
}

但是当我尝试将这些项目转换为它们各自的子类时,我得到了一个 ClassCastException。我认为这样的事情是可行的。我错过了什么吗?有什么替代方法做这样的事情?

标签: javainheritancecollectionscasting

解决方案


制作MyClass抽象并添加一个抽象process方法,就像@JoakimDanielson 建议的那样。然后,在您的子类中,覆盖该方法并实现您自己的逻辑。

public abstract class MyItem {
    ...
    public abstract void process();
}

public class PromotionalItem extends MyItem {
    ...
    @Override
    public void process() {
        // do whatever
    }
}

 public class SellableItem extends MyItem {
    ...
    @Override
    public void process() {
        // do whatever
    }
}

然后,在您的processItem方法中,只需调用process

public void processItem(MyItem item) {
    item.process();
}

推荐阅读