首页 > 解决方案 > 类型 T 的方法 visit() 未定义 - 为什么?

问题描述

我不明白为什么我得到T 类型的方法 visit() 是未定义的。显然,这里的类型 T 应该是Node。类Node具有 visit() 函数。那么编译器在抱怨什么?此代码应该是一个接受任何数据类型作为其节点的 Graph:

public class Graph<T>{

        public Map<T, List<T>> map = new HashMap<>();
    
        public void addEdge(T source, T destination, boolean bidirectional){
            if (!map.containsKey(source)){
                addVertex(source);
            }
            if (!map.containsKey(destination)){
                addVertex(destination);
            }
                if (!map.get(source).contains(destination)){
                    map.get(source).add(destination);
                }
                if (bidirectional){
                    if (!map.get(destination).contains(source)){
                        map.get(destination).add(source);
                    }
                }
        }
    
        public void bfs(T node){
            Queue<T> q = new LinkedList<>();
            node.visit();
            System.out.println(node.n);
            q.add(node);
            int len;
    
            while(!q.isEmpty()){
                T n = q.remove();
                n.visit();
                System.out.println(n.n);
                for (T i : map.get(n)){
                    if (!i.visited){
                        q.add(i);
                    }
                }
            }
        }
    
        static class Node{
            int n;
            boolean visited;
            public Node(int n){
                this.n = n;
                visited = false;
            }
            public void visit(){
                visited = true;
            }
            public void unvisit(){
                visited = false;
            }
        }
            
        public static void main(String[] args){
            Graph<Node> g = new Graph<>();
    
            Node zero = new Node(0);
            Node five = new Node(5);
            Node four = new Node(4);
            
            g.addEdge(zero, five, false);
            g.addEdge(zero, four, false);
    
            g.bfs(zero);            
        }
    }

标签: javagenerics

解决方案


If Tis only ever Node,删除类型Graph并直接使用Node

如果T可以是各种类,那么仅使用的问题TT无限的——就像T extends Object——但visit()不是为所有对象定义的。

解决问题的正确方法是定义一个接口:

interface Visitable {
    void visit();
}

Node实现它:

class Node implements Visitable {
    ...
}

为 T 添加一个边界:

public class Graph<T extends Visitable> {
    ...
}

根据需要重复/组合其他方法。


在这种情况下,通常键入Node,它会有一个字段T value;。也许这就是你的意图?


推荐阅读