首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java泛型和集合的问题

Java泛型和集合的问题
EN

Stack Overflow用户
提问于 2015-02-06 14:06:47
回答 1查看 133关注 0票数 3

我有一个类,它表示一个树状结构,基本的位元如下所示:

代码语言:javascript
复制
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
}

现在,当我将节点一个接一个地放置在测试用例中时,这是非常好的:

代码语言:javascript
复制
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 resolved to List<Integer>时,它工作得很好,那么List<List<Integer>>为什么要遵从placeAll(Collection<T> c)呢?考虑到List<T>是一个Collection<T>,我无法理解这件事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-06 14:16:45

问题是,该方法需要一个Collection<Object> (在您的示例中,T似乎是Object ),但是您正在传递一个Collection<List<Integer>>。虽然List<Integer>Object,但Collection<List<Integer>>不是Collection<Object>的子类。

将方法签名更改为接受Collection<? extends T>,然后它就可以工作了。

代码语言:javascript
复制
public Node<T> placeAll(Collection<? extends T> elements) {   
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28367556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档