2016-05-16 11 views
1

Ich habe die folgenden zwei Methoden, um Elemente innerhalb einer Auflistung herauszufiltern, die Instanzen einer Klasse sind. Diese erste Methode kompiliert OK, während die zweite nicht.WildCard Capture in Java

Die einzige Änderung von der ersten zur zweiten Methode liegt in der generischen Typdefinition der Ausgabesammlung.

Ich würde gerne wissen, warum die zweite Methode nicht kompiliert, da, soweit ich weiß, scheint es eine sichere Operation durchzuführen. Kann eine Hilfsmethode nützlich sein? Wenn ja, wie soll sie codiert werden ?.

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

Bitte zeigen Sie uns den Compilerfehler. – Turing85

Antwort

1

Sie haben ein logisches Problem in Ihrem Code. Sie definieren, dass destinationCollection Instanzen eines Typs, die Untertypen von T halten können. Daher ist es nicht garantiert, dass Sie eine T innerhalb destinationCollection speichern können (eine ArrayList<Pug> kann keine Dog halten, vorausgesetzt, dass Pug extends Dog). Ich denke, was Sie eigentlich wollen, ist ? super T anstelle von ? extends T.