【发布时间】:2014-04-03 11:32:33
【问题描述】:
我正在尝试实现生成 Apache XmlBeans 对象的构建器模式。
我已经为我的所有类生成了构建器,它们继承自:
public abstract class Builder<T extends XmlObject> {
protected T xmlObject;
@SuppressWarnings("unchecked")
public T build() {
return (T) xmlObject.copy();
}
}
然后我创建了几个像这样的构建器(Time2Save 继承自 XmlObject):
public class Time2SaveBuilder extends Builder<Time2Save> {
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<Time2Save> {
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)如果有什么方法可以做到这一点,而无需在每个电话中重复工厂调用构建器实现。谢谢!
【问题讨论】:
-
我写了一个关于为高度可扩展的类创建构建器的相关问题/答案:programmers.stackexchange.com/questions/228939/…
标签: java generics builder xmlbeans