为 Java 个 Bean 替换 instanceof

Replacing instanceof for Java Beans

我在使用 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);
}

这很丑,我想换掉它。所以我看了一下将我的作者分成新的 类 WriterBeanAWriterBeanBWriterBeanCWriter。我这样做是因为显然为了保持我的 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 只是被转换为 [=25] =]...

谁能找到解决这个问题的方法/这里出了什么问题?

(我不想扔掉 JavaBeans 也不想听说它是一种反模式,因为更改 bean 可能会使很多代码退化)。

您可以使用基于 class 的泛型而不是基于方法的泛型:

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();
    }
}