2014-04-16 65 views
0

有沒有一種方法可以檢查一個列表是否符合另一個列表的要求?我有一個列表源和一個列表目的地。類型還不知道,這就是它們通用的原因。我試圖找到一種方法,它可以檢查源中的元素是否與目標類型匹配。如果是這樣,那麼該元素將被添加到目的地。如何檢查列表<E>是否符合另一個列表的要求<E>

public interface UnaryPredicate<E> { 

public List<E> copyIf(List<E> source,List<E> destination); 

} 

public class Copy<E> implements UnaryPredicate{ 



public List copyIf(List source, List destination) 
{         


    for (List temp: source) 
    { 
     //if source meets requirement, 
      destination.add(temp); 
    } 

} 


public static void main(String[] args) 
{ 

} 

}

回答

0

這是一個可行的方法,使用Class#isAssignableFrom(Class) -

public static <E, F> List<F> copyIf(List<E> source, 
    List<F> destination, Class<F> cls) { 
    for (E e : source) { 
    if (cls.isAssignableFrom(e.getClass())) { 
     destination.add((F) e); 
    } 
    } 
    return destination; 
} 

public static void main(String[] args) { 
    String s = "Hello"; 
    List<String> al = new ArrayList<String>(); 
    al.add(s); 
    System.out.println(copyIf(al, new ArrayList<String>(), String.class)); 
} 

輸出是

Hello 
0

我想你可能想通過定義通用接口的所有元素的父編譯時保證這一點,說這就是所謂的IBaseElement;然後

List<E extends IBaseElement> 
1

目前還不清楚,你想在這裏什麼。你是想以每個元素爲基礎完成這個工作,還是僅僅比較列表類型?它可以在編譯時使用稍微更復雜的泛型來完成嗎?這樣做的目的是什麼?具體來說,你在嘗試要做什麼

首先,當您編寫代碼時,您將傳入兩個單獨的列表E。由於它們具有相同的類型,因此它們將在編譯時進行驗證,並且它們將兼容。然而,你可能已經打算讓它們成爲不同的類型,在這種情況下,事情會變得更復雜一些。

如果您在每個元素的基礎上進行檢查,或者必須在運行時動態執行檢查,由於Java的類型擦除,如果沒有額外的工作,就無法執行此操作。你可以在一個類中傳遞元素必須是兼容的,就像這樣:

public List<E> copyIf(Class<E> compatible, List<?> source, List<?> destination); 

然後,你可以一個元素乘元素的基礎上進行比較。

在另一方面,如果你只需要確保列表是兼容的,只是讓編譯器做的工作:

public List<E> copyIf(List<? extends E> source, List<E> destination); 
0

您所做的一切早已保證源和目標列表編譯時間。如果您想傳遞任何類型的源列表,並且在目標類型允許的情況下進行復制,則需要爲此目的傳遞一個額外的參數作爲Class,因爲Java中的Generics基於Erasure,而您不能這樣做在運行時檢查類型參數。

簡要

public List<E> copyIf(List<?> source, List<E> destination, Class<E> destinationType) { 
    for (Object o : source) { 
     if (destinationType.isInstance(o) { 
      .... 
     } 
    } 
} 

所以它可以作爲:

copyIf(anyList, destList, DestinationType.class); 

而且,你應該允許更靈活的目的地,你的代碼可以更合理的情況下工作:

public List<E> copyIf(List<?> source, 
         List<? super E> destination, 
         Class<E> destinationType) { .... 
相關問題