我在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>)
为什么呢?提前谢谢?
答案 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