2017-05-15 7 views
6

フィルタを適用した後に数を数えるための簡単な汎用メソッドを作成したいと思います。フィルタを適用した後に数を数える単純な汎用メソッドを作成したい

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

それは私に、このエラーを与える:

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

ありがとうございました。 –

答えて

6

2番目のパラメータは最初の1に依存するあなたは、このようにワイルドカードを使用することはできません!あなたのバージョンは、あなたがそれにバナナプレディケートを適用するためにコレクションを取ることを意味します。

言い換えれば、単純に、不明な型のパラメータを宣言します。それを使用します:

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

レコードの場合:count()は長い結果を返します。私はそれに応じて戻り値の型を変更しました。それがあなたが望むものでなければ、あなたはintにキャストしなければならないが、(潜在的な)情報の損失で生きていなければならない。

関連する問題