泛型方法不适用于参数

时间:2012-10-01 04:33:48

标签: java generics

我在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>)

为什么呢?提前谢谢?

2 个答案:

答案 0 :(得分: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);
    }


}

答案 1 :(得分:1)

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

 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. Raw Types