有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型如何从Java DisjointSet创建父节点的实例

以下是数据结构的链接:http://git.eclipse.org/c/platform/eclipse.platform.ui.git/plain/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/DisjointSet.java

以下是我在主要方法中尝试的内容。 (父节点指向自身,秩为0。)

 public static void main(String[] args) {
    DisjointSet x = new DisjointSet();
    **Node<T> parent = new Node<T>(parent, 0);**
 }

以下是我的错误信息:

错误:无法从静态上下文引用非静态类型变量T

错误:无法从静态上下文引用非静态类型变量T

看起来等号两边的T都有一个错误


共 (1) 个答案

  1. # 1 楼答案

    错误是因为您正在从静态方法中访问非静态实例变量

    接口的所有成员字段默认为publicstaticfinal

    由于默认情况下内部接口是static,所以不能从static字段或方法中引用T

    T实际上与一个类的实例相关联,如果它与一个与类关联的static字段或方法相关联,那么它就没有任何意义

    您可以创建一个包含以下信息的类:

    public class MyTreeNode<T>{
        public T data = null;
        public MyTreeNode parent = null;
    
        public MyTreeNode(T data) {
            this.data = data;
        }
    
        public void addChild(MyTreeNode child) {
            child.setParent(this);
            this.children.add(child);
        }
    
        public void addChild(T data) {
            MyTreeNode<T> newChild = new MyTreeNode<>(data);
            newChild.setParent(this);
            children.add(newChild);
        }
    
        public void addChildren(List<MyTreeNode> children) {
            for(MyTreeNode t : children) {
                t.setParent(this);
            }
            this.children.addAll(children);
        }
    
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    

    并举例说明:

    MyTreeNode<String> root = new MyTreeNode<>("Root");
    
    MyTreeNode<String> child1 = new MyTreeNode<>("Child1");
    child1.addChild("Grandchild1");
    child1.addChild("Grandchild2");
    
    MyTreeNode<String> child2 = new MyTreeNode<>("Child2");
    child2.addChild("Grandchild3");
    
    root.addChild(child1);
    root.addChild(child2);
    root.addChild("Child3");
    
    root.addChildren(Arrays.asList(
            new MyTreeNode<>("Child4"),
            new MyTreeNode<>("Child5"),
            new MyTreeNode<>("Child6")
    ));
    
    for(MyTreeNode node : root.getChildren()) {
        System.out.println(node.getData());
    }
    

    参考:herehere