簡體   English   中英

Java中的泛型方法應該具有什么簽名,以便它可以接受任何<T實現Iteralbe並存儲List <U >>和......?

[英]What signature should a generic method in Java have so that It can accept any <T that implements Iteralbe and stores List<U>> and…?

我想創建一個遍歷任何存儲ArrayList<U>集合的方法 - 讓我們調用該集合T ; 例如,它可以是LinkedListArrayList或任何其他Collection ; U - 是另一種需要記憶的類型; 我想要創建的方法應該返回相同的集合T但它應該存儲LinkedList<U>

“錯誤的”希望聲明:

public <T extends Collection, U> T<LinkedList<U>> rewrap (T<ArrayList<U>> arrayList) {
    T<LinkedList<U>> linkedList = new T<LinkedList<U>>();
    // do some stuff here
    return linkedList;
}

我仔細閱讀了文檔但我找不到如何實現目標的方法。

我的建議:

public static <T, C extends Collection<LinkedList<T>>> C rewrap (Collection<ArrayList<T>> in, Supplier<C> collectionFactory) {

    C out = collectionFactory.get ();

    for (ArrayList<T> list : in) {
      out.add (new LinkedList<T> (list));
    }

    return out;
}

請注意,您必須傳遞Supplier才能使該方法能夠創建所需類型的Collection實例。

用法:

ArrayList<ArrayList<String>> in = new ArrayList<> ();
in.add (new ArrayList<String> ());
in.get (0).add ("abc");
ArrayList<LinkedList<String>> out = rewrap (in, ArrayList::new);

編輯:您應該注意,此方法不要求輸出外部Collection的類型與輸入外部Collection的類型相同。

例如,如果在上面的示例中傳遞HashSet::new供應商而不是ArrayList::new ,則可以傳遞ArrayList<ArrayList<String>>輸入並獲取HashSet<LinkedList<String>>輸出。

這將符合您的請求,但不嚴格執行返回集合類型以匹配輸入類型:

public <U> List<LinkedList<U>> rewrap(Collection<ArrayList<U>> arrayList) {
    T linkedList = ...
    // do some stuff here
    return linkedList;
}

我不認為通用接口有一種方法可以在編譯時強制執行返回的列表與進入的Collection具有相同的實現。

另請注意,您無法重復使用ingoing集合或調用new T<...>() 您必須使用反射或其他方法參數。

伊蘭的回答很好。 但是,如果您不想通過供應商,則可能需要采用此方法

public static void main(String[] args) {
    // create inner list
    ArrayList<String> innerList = new ArrayList<>();
    innerList.add("test string 1"); innerList.add("test string 2");
    // add it to outer List twice because why not
    ArrayList<ArrayList<String>> outerList = new ArrayList<>();
    outerList.add(innerList); outerList.add(innerList);
    // rewrap it
    ArrayList<LinkedList<String>> rewrapped = rewrap(outerList);
    System.out.println("rewrapped.");
}

public static <T, C extends Collection<LinkedList<T>>> C rewrap (Collection<ArrayList<T>> in) {

    Collection<LinkedList<T>> out = null;
    try {
        out = (in.getClass().newInstance());
    } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
    C myC = (C) out;

    for (ArrayList<T> list : in) {
        myC.add (new LinkedList<T> (list));
    }

    return myC;
}

當然,您需要一些更好的異常處理,但這個示例代碼按照我的預期工作。

暫無
暫無

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

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