Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换Java bean的instanceof_Java_Generics_Polymorphism_Instanceof - Fatal编程技术网

替换Java bean的instanceof

替换Java bean的instanceof,java,generics,polymorphism,instanceof,Java,Generics,Polymorphism,Instanceof,我在一个有JavaBeans的项目中遇到了一些代码。我发现了一个Writer对象,它将这些bean写入文件。不幸的是,在写入文件之前,它使用instanceof询问bean的类型,如下所示: if (bean instanceof BeanA) { writer.handleBeanA(bean); } else if (bean instanceof BeanB) { writer.handleBeanB(bean); } else if (bean instanceof Be

我在一个有JavaBeans的项目中遇到了一些代码。我发现了一个
Writer
对象,它将这些bean写入文件。不幸的是,在写入文件之前,它使用
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拆分为新类
writer
BeanAWriter
beanwriter
beanwriter
。我这样做是因为显然为了保持JavaBean结构,我不能向bean中添加方法
write()

当我调用
Writer
时,我将bean作为抽象父级
bean
传入,因为调用此Writer的函数不关心它处理的bean类型

现在我开始编写我的新类,我遇到了一个问题,我覆盖的函数如下所示:

public abstract boolean <T extends Bean> writeBean(T bean);
public abstract boolean <T extends Bean> writeBean(T bean) {
    bean.accessBeanAProperty();
}
此代码无法工作,因为T仅被识别为
Bean
,而不是
BeanA
,这意味着我的
实例只被转换为
BeanA

有人能找到解决这个问题的办法吗


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

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

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();
    }
}
公共抽象类BeanWriter{
公共抽象布尔writeBean(tbean);
}
公共类BeanWriter扩展BeanWriter{
公共布尔写bean(beanabean){
accessBeanProperty();
}
}

如何将它们写入文件?那是文本文件吗?json还是什么?编写器将从bean中获取特定的(不同的类型)字段,并从中构造字节表示,然后将其保存为文本文件。为什么编写器需要这样向下转换?它需要访问子类字段?啊,你不需要所有字段。因为bean根据定义是可序列化的,所以您可以序列化它们,而无需携带类型。但它将存储所有字段,而不是序列化字段。在将它们保存到文件中之前,会对它们进行操作。但是,假设它们是给定的,例如
列表
。现在,他们正在为每个bean创建一个writer,他们仍然需要使用
instanceof
来确定要实例化哪个writer。要使用
List
实现这一点,您必须有某种注册表来映射
Class@Rossiar这与
instanceof
的问题完全相同。现在,您需要为每个Bean创建一个编写器。如果你将类映射到编写器,那么你也在做同样的事情。是的,理想情况下,我会声明一个接口
write()
,并在
Bean
的基础上实现。还是你有别的想法?理想远非我所能处理的。。。