我该如何解决这个ClassCastException?

时间:2016-04-25 07:08:30

标签: java

当我在执行BFS时将顶点添加到链表时,

获取ClassCastException。需要帮忙 信息:Vertex是一个用户定义的类,它有一个Edge类对象的链接列表。

这是我的代码:

private void reachable() {
        clearAll();

        for (Vertex v : vertexMap.values())
            v.setColor("white");

        for (Vertex s : vertexMap.values())
            if (s.isStatus())
                bfs(s);
    }

    private void bfs(Vertex s) {

        s.setColor("gray");
        s.dist = 0;
        s.prev = null;

        Queue<Vertex> vertices = new PriorityQueue<Vertex>();
        vertices.add(s);

        while (!vertices.isEmpty()) {
            Vertex u = vertices.remove();
            for (Iterator i = u.adjacent.iterator(); i.hasNext();) {
                Edge edge = (Edge) i.next();
                Vertex adj = edge.getDestVertex();
                if (!adj.getName().equals(u.getName()) && adj.isStatus())
                    if (adj.getColor().equals("white")) {
                        adj.setColor("gray");
                        adj.dist = u.dist + 1;
                        adj.prev = u;
                        vertices.add(adj);
                    }
            }
            u.setColor("black");
        }
    }

1 个答案:

答案 0 :(得分:1)

我猜这个问题就在这里:

    Queue<Vertex> vertices = new PriorityQueue<Vertex>();
    vertices.add(s);  // <<<---- HERE

PriorityQueue需要能够比较参数类型的实例(即Vertex)以确定它们的相对优先级。如果使用Comparator<Vertex>对象作为参数实例化队列,则队列将使用该队列来确定优先级。否则,它希望Vertex实现Comparable<Vertex>

发生异常是因为在add操作中,代码正在尝试将Vertex个对象转换为Comparable

解决方案:

  1. 将类声明为... class Vertex implements Comparable<Vertex>并提供int compareTo(Vertex)方法的实现。

  2. 实现Comparator<Vertex>类,其实现为int compare(Vertex, Vertex),并将实例传递给PriorityQueue构造函数。 (您可以使用匿名类。)

  3. 无论哪种方式,compare / compareTo方法都是队列优先级的基础。相应地实施它。