簡體   English   中英

Java泛型和集合的問題

[英]Problems with Java generics and collections

我有一個表示樹狀結構的類,基本位如下所示:

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

我不太明白這一點...如果我用T解析為List<Integer>調用addElement(T el)工作正常,為什么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> Collection<? extends T> ,然后它應該工作。

public Node<T> placeAll(Collection<? extends T> elements) {   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM