首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型内部的泛型

泛型内部的泛型
EN

Stack Overflow用户
提问于 2012-12-04 16:05:55
回答 2查看 195关注 0票数 2

首先,我想向你们展示我想要达到的目标。我想从类中生成一个XML文件,如下所示:

代码语言:javascript
复制
<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>

摘要:

  • 条件有一个名称和一个默认值(可以是String、int或double)和x项作为childs。
  • 项具有一个值,该值必须具有相同类型的父级标准defaultValue。
  • 一个项目也可以包含另一个标准。标准中的defaultValue类型独立于父(项)类型

例如:

代码语言:javascript
复制
criteria (type int)
   item (type int)
      criteria(type String)
         item(type String)

我还需要以类的形式建立这个模型,因为我想在以后对它进行一些验证。

现在,我在一个特定的点上挣扎,让我先给你们展示我的课程:

配置:

代码语言:javascript
复制
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="config")
public class Config {

    @XmlElement(name = "criteria")
    private List<Criteria> criteriaList = new ArrayList<Criteria>();

    /*getters and setters*/
}

条件:

代码语言:javascript
复制
@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*/
}

项目:

代码语言:javascript
复制
@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*/
}

这样,我就可以制定一个特定类型的标准,该类型具有相同类型的项。

现在,我想在项目下插入一个标准,它的类型与项目不同,但这是不可能的:

代码语言:javascript
复制
    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);

我也尝试过这样的声明(在项目中):

代码语言:javascript
复制
@XmlElement
protected <U> List<Criteria<U>> criteria;

但这只适用于方法,而不是属性。

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

发布于 2012-12-04 16:22:07

我认为你很接近解决这个问题。主要的问题是

代码语言:javascript
复制
protected Criteria<T> criteria = new ArrayList<Criteria<T>>();

是不对的根据您的要求,标准不需要具有与父项相同的类型。我看到的一种可能性是

代码语言:javascript
复制
 protected Criteria<?> criteria = new ArrayList<Criteria<?>>();

现在唯一的问题是,我认为您将得到一个警告/当您尝试在列表中插入或获取元素时,您将不得不强制转换。

票数 0
EN

Stack Overflow用户

发布于 2012-12-04 16:34:43

那这个呢。

类别项目:

代码语言:javascript
复制
public class Item<T,U>{

    protected T key;

    protected String display;

    protected Criteria<U> criteria = new Criteria<U>();

    /*getters and setters*/
}

班级标准:

代码语言:javascript
复制
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的项目作为内在标准。通过这种方式,您必须事先指定项目对象的标准类型,但是可以将具有不同条件类型的项目混合到相同的条件中,如下面的代码片段所示:

代码语言:javascript
复制
Criteria<String> c1 = new Criteria<String>();
c1.items.add(new Item<String,Float>());
c1.items.add(new Item<String,Integer>());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13706993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档