泛型方法中的泛型

时间:2012-08-01 22:55:20

标签: java generics types recursion

我的架构有一些类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,它的子元素发送到下一个,所以...

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您的定义是:

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

因此T属于XMLElement类型或其子类型之一。 U属于XMLElement类型或其子类型之一。

总之,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();
}