2017-10-17 27 views
4

ここに私のコードです。互換性のない型:述語<CAP#1>は述語<?に変換できません。スーパーCAP#2>

import java.util.stream.Stream; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.function.Predicate; 

public class StreamMethod{ 
    public static void main(String... args){ 
     List<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8)); 

     allMatch(data, x -> x < 10); 
    } 

    public static <T> void allMatch(List<?> list, Predicate<? super T> predicate){ 
     boolean allSatisfy = list.stream().allMatch(predicate); 
     System.out.println(allSatisfy); 
    } 
} 

エラーincompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>が表示されます。あなたはそれを解決するために私を助けることができますか?なぜこのエラーが表示されていますか?

それから私はまた

Predicate<Integer> pred= x -> x < 10; 
allMatch(data, pred); 

として引数を渡すしかし、まだエラーが直面しているの上記の行を変更します。

答えて

2

あなたはList<T> list代わりのList<?> list

+0

あなたはそれを説明することができますしてくださいに変更する必要がありますか? – UnKnown

+2

@UnKnown値のリストにワイルドカード '? 'を使用する際の問題は、' allMatch'メソッドの中にどのタイプの要素が入っているのかコンパイラが知らないことです。 'Predicate'は' T'のためのものですが、リストには 'T''、' Object's、 'Banana's、' Minion'sなど何かが含まれている可能性があります...そして、エラーは 'Predicate 'これらの値をフィルタリングするために使用することはできません。 'List 'を使うことで、コンパイラはすべての要素が 'T 'であることを示し、' Predicate'はそれらをフィルタリングできます。 –

関連する問題