【问题标题】:The method visit() is undefined for the type T - Why?类型 T 的方法 visit() 未定义 - 为什么?
【发布时间】:2021-11-14 23:59:44
【问题描述】:

我不明白为什么我会得到类型 T 的方法 visit() 未定义。显然,这里的类型 T 应该是 NodeNode 类有 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);            
        }
    }

【问题讨论】:

  • T 是不是除了 Node 之外的任何东西?
  • 我试图实现一个泛型类,不管 T 是什么。在这种特定情况下,不,它总是一个节点。

标签: java generics


【解决方案1】:

如果T 只是Node,请从Graph 中删除类型,然后直接使用Node

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

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

interface Visitable {
    void visit();
}

Node实现它:

class Node implements Visitable {
    ...
}

给 T 添加一个绑定:

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2015-04-23
    • 2017-03-09
    • 2022-11-03
    相关资源
    最近更新 更多