2

まず、私が達成したいことをお見せしたいと思います。次のようなクラスから 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 と同じタイプでなければなりません。
  • Item は別の基準を保持することもできます。条件の defaultValue のタイプは、親 (項目) のタイプから独立しています

例えば:

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;

しかし、それはプロパティではなく、メソッドに対してのみ機能します。

誰でも助けることができますか?

4

2 に答える 2

0

問題の解決にかなり近づいていると思います。主な問題は、

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

は正しくありません。要件により、条件は親アイテムと同じタイプである必要はありません。私が見る1つの可能性は

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

唯一の問題は、リストに要素を挿入または取得しようとすると、警告が表示される/キャストする必要があると思うことです。

于 2012-12-04T16:22:07.780 に答える
0

これはどうですか。

クラス項目:

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 を持つアイテムがあると言っています。この方法では、Item オブジェクトの Criteria タイプを事前に指定する必要がありますが、次のスニペットに示すように、異なる Criteria タイプの Item を同じ Criteria に混在させることができます。

Criteria<String> c1 = new Criteria<String>();
c1.items.add(new Item<String,Float>());
c1.items.add(new Item<String,Integer>());
于 2012-12-04T16:34:43.630 に答える