首先,我想向你们展示我想要达到的目标。我想从类中生成一个XML文件,如下所示:
<config>
<criteria name="criteriaName" defaultValue="0">
<item value="1">
<criteria name="criteriaName2" defaultValue="">
<item value="foo">
</item>
<item value="bar">
</item>
</criteria>
</item>
<item value="2">
</item>
</criteria>
<criteria name="criteriaName3" defaultValue="">
<item value="foo">
</item>
</criteria>
</config>摘要:
例如:
criteria (type int)
item (type int)
criteria(type String)
item(type String)我还需要以类的形式建立这个模型,因为我想在以后对它进行一些验证。
现在,我在一个特定的点上挣扎,让我先给你们展示我的课程:
配置:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="config")
public class Config {
@XmlElement(name = "criteria")
private List<Criteria> criteriaList = new ArrayList<Criteria>();
/*getters and setters*/
}条件:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="criteria")
public class Criteria<T> {
@XmlAttribute
private T key;
@XmlAttribute
private String display;
@XmlAttribute
private T defaultValue;
private List<Item<T>> items = new ArrayList<Item<T>>();
public T getKey() {
return key;
}
/*getters and setters*/
}项目:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="item")
public class Item<T>{
@XmlAttribute
protected T key;
@XmlAttribute
protected String display;
@XmlElement
protected List<Criteria<T>> criteria = new ArrayList<Criteria<T>>();
/*getters and setters*/
}这样,我就可以制定一个特定类型的标准,该类型具有相同类型的项。
现在,我想在项目下插入一个标准,它的类型与项目不同,但这是不可能的:
Config config = new Config();
Criteria<Integer> criteria = new Criteria<Integer>();
Item<Integer> item = new Item<Integer>();
Criteria<String> subCriteria = new Criteria<String>();
//this obviously doesn't work
item.getCriteria().add(subCriteria); //<--
criteria.getItems().add(item);
config.addCriteria(criteria);我也尝试过这样的声明(在项目中):
@XmlElement
protected <U> List<Criteria<U>> criteria;但这只适用于方法,而不是属性。
有人能帮忙吗?
发布于 2012-12-04 16:22:07
我认为你很接近解决这个问题。主要的问题是
protected Criteria<T> criteria = new ArrayList<Criteria<T>>();是不对的根据您的要求,标准不需要具有与父项相同的类型。我看到的一种可能性是
protected Criteria<?> criteria = new ArrayList<Criteria<?>>();现在唯一的问题是,我认为您将得到一个警告/当您尝试在列表中插入或获取元素时,您将不得不强制转换。
发布于 2012-12-04 16:34:43
那这个呢。
类别项目:
public class Item<T,U>{
protected T key;
protected String display;
protected Criteria<U> criteria = new Criteria<U>();
/*getters and setters*/
}班级标准:
public class Criteria<T> {
private T key;
private String display;
private T defaultValue;
private List<Item<T,?>> items = new ArrayList<Item<T,?>>();
public T getKey() {
return key;
}
/*getters and setters*/
}基本上,我们是说你有另一种类型U的项目作为内在标准。通过这种方式,您必须事先指定项目对象的标准类型,但是可以将具有不同条件类型的项目混合到相同的条件中,如下面的代码片段所示:
Criteria<String> c1 = new Criteria<String>();
c1.items.add(new Item<String,Float>());
c1.items.add(new Item<String,Integer>());https://stackoverflow.com/questions/13706993
复制相似问题