在我们有JavaBeans的项目中,我遇到了一些代码。我发现了一个将这些bean写入文件的Writer对象。不幸的是,在编写文件之前,这使用instanceof来询问bean是什么类型,如下所示:
if (bean instanceof BeanA) {
    writer.handleBeanA(bean);
} else if (bean instanceof BeanB) {
    writer.handleBeanB(bean);
} else if (bean instanceof BeanC) {
    writer.handleBeanC(bean);
}这太难看了,我想把它换掉。因此,我考虑将我的作者分成新的类Writer、BeanAWriter、BeanBWriter、BeanCWriter。我这样做是因为显然为了保持我的JavaBean结构,我不能向Beans中添加一个方法write()。
当我调用Writer时,我将我的bean作为一个抽象父Bean传入,因为调用这个作者的函数并不关心它处理的是哪种类型的bean。
现在我开始编写我的新类--我遇到了一个问题,我正在重写的函数如下所示:
public abstract boolean <T extends Bean> writeBean(T bean);但是BeanAWriter中的代码如下所示:
public abstract boolean <T extends Bean> writeBean(T bean) {
    bean.accessBeanAProperty();
}这段代码不能工作,因为T只被识别为Bean而不是BeanA,这意味着我的instanceof只是被转换为BeanA.
有人能找到解决这个问题的办法吗?
(我不想丢弃JavaBeans,也不想听到它是一种反模式,因为更改bean可能会导致大量代码倒退)。
发布于 2015-05-12 12:39:29
您可以使用基于类的泛型而不是基于方法的泛型:
public abstract class BeanWriter<T extends Bean> {
    public abstract boolean writeBean(T bean);
}
public class BeanAWriter extends BeanWriter<BeanA> {
    public boolean writeBean(BeanA bean) {
        bean.accessBeanAProperty();
    }
}https://stackoverflow.com/questions/30190837
复制相似问题