2

私のアーキテクチャにはいくつかのクラス XMLElement があります (その子の内部型として定義)

これをコンパイルしないのはなぜですか?

private static <T extends XMLElement<U>, U extends XMLElement<?>> T recursiveFilter(T root){
        T filteredRoot = root;
        //Some filtering stuff
        for (U child : root.getSubElements()){
            U cleanChild = recursiveFilter(child); //Here comes the problem, it says reursiveFilter can only accept T but now we are sending U != T
        }
        return filteredRoot;
    }
}

U (T の子) を現在の反復の関数に送信していますが、U は次の反復で T になり、その子である U を次の関数に送信します。

4

2 に答える 2

3

使用できませんか:

private static <T extends XMLElement<T>> T recursiveFilter(T root) {
    T filteredRoot = root;
    //Some filtering stuff
    for (T child : root.getSubElements()) {
        T cleanChild = recursiveFilter(child);
    }
    return filteredRoot;
}
于 2012-08-01T23:02:08.907 に答える
1

あなたの定義は次のとおりです。

T extends XMLElement<U>, U extends XMLElement<?>

したがってT、タイプXMLElementまたはそのサブタイプの 1 つです。タイプまたはそのサブタイプの 1 つですUXMLElement

要約すると、TUは同じタイプであり、私が見る限り、定義を次のように単純化できるはずです。

private static <T extends XMLElement<T>> T recursiveFilter(T root) {
  //...
}

少なくとも私はこれが私にうまくコンパイルされることを知っています:

static <T extends XMLElement<T>> T recursiveFilter(T root){
    T filteredRoot = root;
    for(T child: root.getSubElements()){
        T cleanChild = recursiveFilter(child);
    }
    return filteredRoot;
}

interface XMLElement<T> {
    List<T> getSubElements();
}
于 2012-08-02T00:10:30.113 に答える