簡體   English   中英

如何獲取已傳遞集合的子集合 <generic type> 成員在哪里擴展或實施另一個?

[英]How to get a sub-collection of a passed collection<generic type> where members extend or implement another?

我正在做的事情涉及一個帶有兩個泛型類型參數(T1,T2)和一個參數(即集合)的函數。 我需要獲取Collection的子集合或子列表,其中包含實現或繼承/擴展T2的集合的所有成員。

我最初的想法是按照對我來說似乎很明顯的方式來做,這本來是:

<T1, T2> void someMethod(Collection<T1> collection)
{
    List<T2> sublist = new ArrayList<T2>();

    for(T1 i : collection)
        if(i instanceof T2)
            sublist.add((T2)i);
}

但是instanceof不能在Java中的泛型類型上使用。

感謝您的幫助^ _ ^

進行instanceof檢查的唯一方法是傳遞表示typeClass對象:

<T1, T2> void someMethod(Collection<T1> collection, Class<T2> type) {
        List<T2> sublist = new ArrayList<T2>();

        for (T1 i : collection) {
            if (type.isAssignableFrom(i.getClass())) {
                sublist.add((T2) i);
            }
        }


    }

假設T1低於T2的類型層次結構,則可以這樣聲明方法:

  <T2, T1 extends T2> void someMethod(Collection<T1> collection)
  {
      List<T2> sublist = new ArrayList<T2>();

      for(T1 i : collection)
              sublist.add(i);
  }

注意,您不需要運行時檢查i因為如果T1沒有鏈接到T2下的類型層次結構,則編譯器將在任何地方拋出編譯時錯誤

暫無
暫無

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

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