2016-05-16 58 views
1

我有以下兩種方法用於過濾掉某個集合中某些類的實例中的元素。這第一種方法編譯好,而第二種方法沒有。Java中的WildCard Capture

從第一個方法到第二個方法的唯一更改是在輸出Collection的泛型類型定義中。

我想知道爲什麼第二種方法不編譯,因爲據我所知,它似乎執行安全操作。可以幫助方法有用嗎?如果是的話,它應該如何編碼?

public static <T> Collection<T> firstFilterCollection(Collection<?> sourceCollection, Class<T> classToFilter) throws InstantiationException, IllegalAccessException { 
    Collection<T> destinationCollection = sourceCollection.getClass().newInstance(); 
    for (Object object : sourceCollection) { 
     if (classToFilter.isInstance(object)) { 
      T t = classToFilter.cast(object); 
      boolean add = destinationCollection.add(t); 
     } 
    } 
    return destinationCollection; 
} 

public static <T> Collection<? extends T> secondFilterCollection(Collection<?> sourceCollection, Class<T> classToFilter) throws InstantiationException, IllegalAccessException { 
    Collection<? extends T> destinationCollection = sourceCollection.getClass().newInstance(); 
    for (Object object : sourceCollection) { 
     if (classToFilter.isInstance(object)) { 
      T t = classToFilter.cast(object); 
      boolean add = destinationCollection.add(t); 
     } 
    } 
    return destinationCollection; 
} 
+0

請向我們展示編譯器錯誤。 – Turing85

回答

1

您的代碼中存在邏輯問題。你定義destinationCollection可以容納一個類型的實例,該子類型由T。因此,不能保證,您可以將T存儲在destinationCollection之內(ArrayList<Pug>不能存儲Dog,因爲Pug extends Dog)。我認爲你實際想要的是? super T而不是? extends T