[英]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
檢查的唯一方法是傳遞表示type
的Class
對象:
<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.