2017-05-15 12 views
6

Chcę utworzyć prostą, ogólną metodę liczenia liczb po zastosowaniu filtru.Chcę utworzyć prostą, ogólną metodę liczenia liczb po zastosowaniu filtru.

static int count(Collection < ? extends Number > numbers, Predicate < ? extends Number > predicate) { 
    return numbers.stream().filter(predicate).count(); 
} 

To daje mi ten błąd:

incompatible types: Predicate cannot be converted to Predicate<? super CAP#2> where CAP#1,CAP#2 are fresh type-variables:

CAP#1 extends Number from capture of ? extends Number

CAP#2 extends Number from capture of ? extends Number

+0

Dziękuję za pomoc. –

Odpowiedz

6

nie można użyć symbolu wieloznacznego w ten sposób, jako drugi parametr zależy od pierwszego! Twoja wersja oznacza, że ​​chcesz pobrać kolekcję jabłek, aby zastosować do niej predykat bananowy.

Innymi słowy: wystarczy zadeklarować parametr typu not-unkown; i używać:

static <T extends Number> long count(Collection<T> numbers, Predicate <T> predicate) { 

Dla przypomnienia: count() powraca długą rezultat; w związku z tym zmieniłem odpowiednio typ zwrotu. Jeśli to nie jest to, czego chcesz, musisz rzucić na int, ale żyć z (potencjalną) utratą informacji.

Powiązane problemy