我正在尝试实现构建器模式以生成Apache XmlBeans对象.
我为我的所有类生成了构建器,它继承自:
public abstract class Builder {
protected T xmlObject;
@SuppressWarnings("unchecked")
public T build() {
return (T) xmlObject.copy();
}
}
然后我创建了几个这样的构建器(Time2Save继承自XmlObject):
public class Time2SaveBuilder extends Builder {
public Time2SaveBuilder(int amount, String unit) {
xmlObject = Time2Save.Factory.newInstance();
xmlObject.setUnit(unit);
xmlObject.setValue(amount);
}
}
它工作得很好.但我遇到的问题是,我不喜欢在每个构建器中实例化xmlObject的重复,如果可能的话,我宁愿在抽象的Builder类中执行它.所以我尝试将此构造函数添加到Builder类:
@SuppressWarnings("unchecked")
public Builder() {
xmlObject = (T) T.Factory.newInstance();
}
并留下这样的实现:
public class Time2SaveBuilder extends Builder {
public Time2SaveBuilder(int amount, String unit) {
xmlObject.setUnit(unit);
xmlObject.setValue(amount);
}
}
问题是我收到以下错误:
Exception in thread "main" java.lang.ClassCastException:
org.apache.xmlbeans.impl.values.XmlAnyTypeImpl cannot be cast to
a.b.c.d.Time2SaveDocument$Time2Save
我认为XmlAnyTypeImpl是调用静态XmlObject.Factory而不是继承类中的一个(在本例中为Time2Save)的结果.我想知道为什么会发生这种情况(因为我正在调用T.Factory而不是XmlObject.Factory)并且如果有任何方法可以在不重复每个构建器实现中的Factory调用的情况下执行此操作.谢谢!