1

Node<T>在课堂上有一个(内部)Graph<T>课程:

public class Graph<T> {
    private ArrayList<Node<T>> vertices;
    public boolean addVertex(Node<T> n) {
        this.vertices.add(n);
        return true;
    }
    private class Node<T> {...}
}

当我运行这个:

Graph<Integer> g = new Graph<Integer>();
Node<Integer> n0 = new Node<>(0);
g.addVertex(n0);

最后一行给我错误:

The method addVertice(Graph<Integer>.Node<Integer>) in the type Graph<Integer> is not applicable for the arguments (Graph<T>.Node<Integer>)

为什么?提前致谢?

4

2 回答 2

1

以下代码对我来说很好。在 JRE 1.6 上运行

public class Generic<T> {
    private ArrayList<Node<T>> vertices = new ArrayList<Node<T>>();

    public boolean addVertice(Node<T> n) {
        this.vertices.add(n);
        System.out.println("added");
        return true;
    }


    public static class Node<T> {
    }

    public static void main(String[] args) {
        Generic<Integer> g = new Generic<Integer>();
        Node<Integer> n0 = new Node<Integer>();
        g.addVertice(n0);
    }


}
于 2012-10-01T04:55:53.650 回答
1

您的内部类不应覆盖T因为T已在外部类中使用。考虑一下如果允许的话会发生什么。您的外部类将引用Integer并且内部类将引用另一个类,该类也用于同一实例。

 public boolean addEdge(Node node1, Node node2) {
        return false;
    }

    Graph<Integer> g = new Graph<Integer>();
    Graph<Integer>.Node n0 = g.new Node(0);// As T happens to be integer you can use inside node class also.

    public class Node {
        T t;
        Node(T t) {
        }
    }

或者您可以使用Static Inner class静态泛型类型,因为静态泛型类型不同于实例泛型类型。

更多解释可以参考JLS #4.8。原始类型

于 2012-10-01T04:56:24.937 回答