Java 泛型和集合的问题
Problems with Java generics and collections
我有一个 class 表示树状结构,基本位如下所示:
public Node<T> placeAll(Collection<T> elements){
for (T e : elements)
addElement(e);
// LOG/DEBUG etc
return root;
}
public void addElement(T el) {
Node<T> node = new Node<T>(el);
addElement(root, node);
}
private void addElement(Node<T> parent, Node<T> child) {
// .... PLACE THE NODE
}
现在,当我将节点一个接一个地放置在测试用例中时,这工作得很好:
public void test() {
List<Integer> s1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
// 13 more lists
List<Integer> s15 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 221, 251);
Hypergraph<Object> hg = new Hypergraph<>(...);
hg.addElement(s1);
System.out.println(hg.getRoot().toStringTree());
System.out.println();
.
.
.
hg.addElement(s15);
System.out.println(hg.getRoot().toStringTree());
System.out.println();
}
如果我添加以下行
hg.placeAll(Arrays.asList(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15));
对于我的测试用例,我收到关于使用泛型的错误:
The method placeAll(Collection<Object>) in the type Hypergraph<Object> is not applicable for the arguments (List<List<Integer>>)
我不太明白...如果 addElement(T el)
在我用 T
解析为 List<Integer>
时工作正常,为什么 List<List<Integer>>
遵守placeAll(Collection<T> c)
?考虑到 List<T>
是 Collection<T>
我无法理解这个..
问题在于该方法需要一个 Collection<Object>
(在您的示例中 T
似乎是 Object
),但您传递的是 Collection<List<Integer>>
。 List<Integer>
是 Object
,Collection<List<Integer>>
是 而不是 Collection<Object>
.
的子类
更改方法签名以接受 Collection<? extends T>
,然后它应该可以工作。
public Node<T> placeAll(Collection<? extends T> elements) {
我有一个 class 表示树状结构,基本位如下所示:
public Node<T> placeAll(Collection<T> elements){
for (T e : elements)
addElement(e);
// LOG/DEBUG etc
return root;
}
public void addElement(T el) {
Node<T> node = new Node<T>(el);
addElement(root, node);
}
private void addElement(Node<T> parent, Node<T> child) {
// .... PLACE THE NODE
}
现在,当我将节点一个接一个地放置在测试用例中时,这工作得很好:
public void test() {
List<Integer> s1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
// 13 more lists
List<Integer> s15 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 221, 251);
Hypergraph<Object> hg = new Hypergraph<>(...);
hg.addElement(s1);
System.out.println(hg.getRoot().toStringTree());
System.out.println();
.
.
.
hg.addElement(s15);
System.out.println(hg.getRoot().toStringTree());
System.out.println();
}
如果我添加以下行
hg.placeAll(Arrays.asList(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15));
对于我的测试用例,我收到关于使用泛型的错误:
The method placeAll(Collection<Object>) in the type Hypergraph<Object> is not applicable for the arguments (List<List<Integer>>)
我不太明白...如果 addElement(T el)
在我用 T
解析为 List<Integer>
时工作正常,为什么 List<List<Integer>>
遵守placeAll(Collection<T> c)
?考虑到 List<T>
是 Collection<T>
我无法理解这个..
问题在于该方法需要一个 Collection<Object>
(在您的示例中 T
似乎是 Object
),但您传递的是 Collection<List<Integer>>
。 List<Integer>
是 Object
,Collection<List<Integer>>
是 而不是 Collection<Object>
.
更改方法签名以接受 Collection<? extends T>
,然后它应该可以工作。
public Node<T> placeAll(Collection<? extends T> elements) {