java - 泛型中的泛型

标签 java xml generics jaxb

首先,我想向您展示我想要实现的目标。 我想从类中生成一个 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 有一个名称和一个默认值(可以是 String、int 或 double) 和 x 项作为子项。
  • 一个 Item 有一个值,该值必须与父标准 defaultValue 的类型相同。
  • 一个项目也可以包含另一个条件。 criteria中defaultValue的类型独立于parents(item)类型

例如:

criteria (type int)
   item (type int)
      criteria(type String)
         item(type String)

我还需要这个类形式的模型,因为我想稍后用它做一些验证。

现在我在一个特定的点上挣扎,让我先向你展示我的类(class):

配置:

@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*/
}

有了它,我可以制定一个特定类型的标准,其中包含相同类型的项目。

现在我想在 Item 下插入一个 Criteria,它的类型与 Item 不同,但这是不可能的:

    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);

我也尝试过类似这样的声明(在 Item 中):

@XmlElement
protected <U> List<Criteria<U>> criteria;

但这仅适用于方法,不适用于属性。

有人能帮忙吗?

最佳答案

我认为您已经非常接近解决问题了。主要问题是

protected Criteria<T> criteria = new ArrayList<Criteria<T>>();

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

 protected Criteria<?> criteria = new ArrayList<Criteria<?>>();

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

关于java - 泛型中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13706993/

相关文章:

java - 如何将 %2f 传递给 java.net.URI 而不将其转换为/

java - Android Studio Pre-Lollipop 模拟器找不到类

xml - 如何在复杂类型的 xsd 文件中使用唯一标记?

java - 在重写方法时面临问题

c++ - scala 是否提供类似 C++ 模板的东西?

java - Websphere Commerce Solr 中的完整构建失败

java - 如何使用 Retrofit 发出请求

java - 我的 AutoCompleteTextView 的 textColor 总是白色

java - Android 布局中的绝对居中

java - 编写容器通用比较器的更好方法