Java 递归方法中的泛型

Java 递归方法中的泛型,java,generics,types,recursion,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.getSub

我的体系结构有一些类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;
    }
}
private static您不能使用:

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;
}
private static T recursiveFilter(T root){
T filteredRoot=根;
//一些过滤材料
for(T子元素:root.getSubElements()){
T cleanChild=recursiveFilter(子级);
}
回流过滤器;
}
您不能使用:

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;
}
private static T recursiveFilter(T root){
T filteredRoot=根;
//一些过滤材料
for(T子元素:root.getSubElements()){
T cleanChild=recursiveFilter(子级);
}
回流过滤器;
}
您的定义是:

T extends XMLElement<U>, U extends XMLElement<?>
至少我知道这对我来说很好:

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();
}
static T recursiveFilter(T root){
T filteredRoot=根;
for(T子元素:root.getSubElements()){
T cleanChild=recursiveFilter(子级);
}
回流过滤器;
}
接口XMLElement{
列出getSubElements();
}
您的定义是:

T extends XMLElement<U>, U extends XMLElement<?>
至少我知道这对我来说很好:

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();
}
static T recursiveFilter(T root){
T filteredRoot=根;
for(T子元素:root.getSubElements()){
T cleanChild=recursiveFilter(子级);
}
回流过滤器;
}
接口XMLElement{
列出getSubElements();
}


我不确定技术原因,但这是不明确的。不需要
U
。只需使用T。但它们不是同一类型。T是xmlement的父子类,U是xmlement的chikd类。换句话说,T.getSubElements()永远不能返回一个元素列表,只是为了澄清,在
xmlement
中,类型参数
U
是子元素类型的一个绑定?您能简单介绍一下您拥有的一些类吗?我想我不完全理解你的设计。我不太清楚你的意思是什么,但如果你的意思是任何孩子都是U型,那么这是肯定的,因为这里没有显示外部结构。我不确定技术原因,但这是含糊不清的。不需要
U
。只需使用T。但它们不是同一类型。T是xmlement的父子类,U是xmlement的chikd类。换句话说,T.getSubElements()永远不能返回一个元素列表,只是为了澄清,在
xmlement
中,类型参数
U
是子元素类型的一个绑定?您能简单介绍一下您拥有的一些类吗?我想我不完全理解你的设计。我不太清楚你的意思,但是如果你的意思是任何孩子都是U型的,那么这是肯定的,因为这里没有显示外部结构。忽略了它,对不起。但是在方法中不需要
U
,所以可以用
替换它,不是吗?root.getSubelements()返回与t不同类型的child。实际上,在U所在的位置返回U->t扩展了XMLElement为什么在这里定义U?这与不使用U和只使用tb是一样的,因为T是父类,U是定义T的子类。XMLElement的子类总是XMLElement忽略了它,抱歉。但是在方法中不需要
U
,所以可以用
替换它,不是吗?root.getSubelements()返回与t不同类型的child。实际上,在U所在的位置返回U->t扩展了XMLElement为什么在这里定义U?这与不使用U和只使用tb是一样的,因为T是父类,U是定义T的子类。XMLElement的子类总是XMLElement你是对的,T的定义与U完全相同,两者都是公共类的子类X,但它们并不对应于相同的特定子类,所以T.getClass()=但两者都是X扩展XMLElement,定义相同。此外,T扩展了XMLElement,但不是相反。如果我试图调用你的函数,编译器会给出错误,因为没有子类定义为T扩展XMlElement,所以它们将自己的类型作为内部类型保存。你是对的,T的定义与U完全相同,两者都是公共类的子类X,但它们不对应于相同的特定子类,所以T.getClass()=但两者都是X扩展XMLElement,定义相同。此外,T扩展了XMLElement,但不是相反。如果我试图调用您的函数,编译器会给出错误,因为没有定义为T扩展XMlElement的子类,所以它们将自己的类型作为内部类型保存