具有泛型参数java的函数

具有泛型参数java的函数,java,generics,Java,Generics,我有一个对象的树T,声明为 public class Tree<T> { private Node<T> root; public Tree(T rootData) { root = new Node<T>(); root.data = rootData; root.children = new ArrayList<Node<T>>(); } pub

我有一个对象的树T,声明为

 public class Tree<T> {

    private Node<T> root;

    public Tree(T rootData) {
        root = new Node<T>();
        root.data = rootData;
        root.children = new ArrayList<Node<T>>();
    }

    public static class Node<T> {
        private T data;
        private Node<T> parent;
        private List<Node<T>> children;
    }
}

有办法做到这一点吗?还是我做错了?

应该是
T param
而不是
param

public void keepBranch(T param) {

        for (Node<T> node : this.root.children) {
            if (param.equals(node.data)) {
                this.root = node;
            }
        }
}
public void keepBranch(T参数){
for(节点:this.root.children){
if(参数等于(节点数据)){
this.root=节点;
}
}
}
编辑 正如评论中所说,它应该是
param.equals(node.data)
而不是
node==param


文档:

它应该是
T param
,而不是
param

public void keepBranch(T param) {

        for (Node<T> node : this.root.children) {
            if (param.equals(node.data)) {
                this.root = node;
            }
        }
}
public void keepBranch(T参数){
for(节点:this.root.children){
if(参数等于(节点数据)){
this.root=节点;
}
}
}
编辑 正如评论中所说,它应该是
param.equals(node.data)
而不是
node==param


文档:

将参数类型更改为
T
。但是您的比较是错误的,您将一个值与一个节点进行比较。更改是为了将节点的值与
param
进行比较:

public void keepBranch(T param) {
    for (Node<T> node : this.root.children) {
        if (param.equals(node.data)) {
            this.root = node;
        }
    }
}
public void keepBranch(T参数){
for(节点:this.root.children){
if(参数等于(节点数据)){
this.root=节点;
}
}
}

将参数类型更改为
T
。但是您的比较是错误的,您将一个值与一个节点进行比较。更改是为了将节点的值与
param
进行比较:

public void keepBranch(T param) {
    for (Node<T> node : this.root.children) {
        if (param.equals(node.data)) {
            this.root = node;
        }
    }
}
public void keepBranch(T参数){
for(节点:this.root.children){
if(参数等于(节点数据)){
this.root=节点;
}
}
}


node==param
正在比较
node==T
。是吗?@jackjay不,不是。它必须与
node.data
进行比较。我只是以这个比较为例,如果你觉得麻烦,我可以编辑它。@jackjay不,我只是想传递一个类型为T的参数,将它与节点数据进行比较。我应该传递节点类型吗?
Node==param
正在比较
Node==T
。是吗?@jackjay不,不是。它必须与
node.data
进行比较。我只是以这个比较为例,如果你觉得麻烦,我可以编辑它。@jackjay不,我只是想传递一个类型为T的参数,将它与节点数据进行比较。我应该传递节点类型吗?OP可能希望通过引用进行比较。例如,某些节点可以相等,但放置在不同的位置tree@VladBochenin最大的问题不是引用比较,而是将
节点
实例(
节点
)与绝对不是
节点
实例(
参数
)的对象进行比较。OP可能希望通过引用进行比较。例如,某些节点可以相等,但放置在不同的位置tree@VladBochenin最大的问题不是引用比较,而是将
节点
实例(
节点
)与绝对不是
节点
实例(
参数
)的对象进行比较.
用于在特定上下文中定义类型变量。但是一旦定义,就可以像使用任何其他类名一样使用
T
。(从语法上讲,也就是说,你不能用一个具体的类名做所有你能做的事情。)你已经在构造函数
公共树(t rootData)
中有了一个正确用法的例子,所以我想知道为什么你认为你需要使用
@Tom从另一个线程获取树代码,我从泛型开始,试图理解它。但你是对的,我应该注意到的<代码中的代码>数据对于整个树应该是唯一的。如果不是这样的话,那么您可以通过数据比较得到错误的分支。@VladBochenin您是对的,我在使用它时会小心的,谢谢<代码>用于在特定上下文中定义类型变量。但是一旦定义,就可以像使用任何其他类名一样使用
T
。(从语法上讲,也就是说,你不能用一个具体的类名做所有你能做的事情。)你已经在构造函数
公共树(t rootData)
中有了一个正确用法的例子,所以我想知道为什么你认为你需要使用
@Tom从另一个线程获取树代码,我从泛型开始,试图理解它。但你是对的,我应该注意到的<代码中的代码>数据对于整个树应该是唯一的。如果不是这样的话,那么您可以通过数据比较得到错误的分支。@VladBochenin您是对的,我在使用它时会小心的,谢谢!